वैकल्पिक पंक्तियों को दो फ़ाइलों से मर्ज करें


9

file1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

करें 2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

आउटपुट फाइल:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
कृपया अपने ऑपरेटिंग सिस्टम का हमेशा उल्लेख करें। बहुत सारे मानक उपकरण अलग-अलग OS पर अलग-अलग व्यवहार करते हैं इसलिए हमें यह जानना होगा कि आप क्या उपयोग कर रहे हैं।
terdon

जवाबों:




5

pasteसमाधान सबसे पोर्टेबल और सबसे कारगर है। मैं केवल इस विकल्प का उल्लेख कर रहा हूँ यदि आप उस मामले में अपना व्यवहार पसंद करते हैं जहाँ दो फ़ाइलों में समान पंक्तियाँ नहीं हैं:

GNU के साथ sed:

sed Rfile1 file2

यदि file1की तुलना में कम लाइनें हैं file2, तो जब file1समाप्त हो जाता है , तो sedइसके लिए कुछ भी आउटपुट नहीं करेगा (जैसा कि खाली लाइनों के लिए विरोध किया जाता है paste)।

यदि file1की तुलना में अधिक लाइनें हैं file2, तो उन अतिरिक्त लाइनों को छोड़ दिया जाएगा (जैसा कि खाली लाइनों को प्रिंट करने के लिए विरोध किया file2जाता है paste)।

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

का उपयोग करते हुए awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRकेवल तभी रिकॉर्ड किया जाता है जब वर्तमान रिकॉर्ड संख्या वर्तमान फ़ाइल रिकॉर्ड संख्या के बराबर होती है (इसलिए यह केवल पहली फ़ाइल को संसाधित करते समय मिलान की जाती है): वर्तमान में संसाधित रिकॉर्ड को xवर्तमान फ़ाइल रिकॉर्ड संख्या के बराबर सरणी में संग्रहीत करता है और स्किप करता है वर्तमान रिकॉर्ड
  • {print x[FNR]"\n"$0}: xनई फ़ाइल के द्वारा और वर्तमान रिकॉर्ड की सामग्री के बाद वर्तमान फ़ाइल रिकॉर्ड संख्या के बराबर एक सूचकांक पर सरणी की सामग्री को प्रिंट करता है
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

यह आउटपुट दे रहा है, लेकिन बिल्कुल वैसा नहीं जैसा मैं चाहता था। tid.info लाइनें मेरे आउटपुट फ़ाइल में tid.setnr लाइनों के बाद आ रही हैं।
पमिपमुई

@ नैनीता वह है जो आप अपने उदाहरण आउटपुट में दिखा रहे हैं।
कोस

@ नैनीता वैसे भी आउटपुट के ऑर्डर को स्विच करने के लिए आप बस स्विच कर सकते हैं file1और file2कमांड में।
कोस

हां ... मैंने भी ऐसा ही किया है लेकिन यह पहले की तरह ही छप रहा था। tid.setnr को प्रिंट करने के बाद यह tid.info को प्रिटिंग कर रहा था।
पम्मीमुई

1
@ माइकर्स हालांकि जब से मैं उस पर था मैंने mawkभी कोशिश की , और यह उस पर भी चलता है। वैसे भी वाजिब होने के नाते मैं यह नहीं देख सकता कि यह सिर्फ दूसरे तरीके से काम क्यों न करे (यानी सिर्फ फाइलें स्विच करके)। ऐसा नहीं है कि awkइनपुट के बारे में परवाह है, लाइनें लाइनें हैं। अगर कुछ उसके संस्करण द्वारा समर्थित नहीं था, तो यह पहली बार टूट गया होगा। और अधिक आसानी से, ओपी ने तर्कों में इनपुट फ़ाइलों को स्विच करने में एक गलती की।
कोस

-1

सबसे आसान समाधान नीचे दिया गया है।

cat file1 >> file2

या

cat file2 >> file1

1
सैचिन, प्रश्न को फिर से पढ़ें; यह एक फ़ाइल की सामग्री को दूसरी फ़ाइल की सामग्री में जोड़ता है। यह लाइनों को बारी-बारी से फ़ाइलों को मर्ज नहीं करता है (इसलिए एक पंक्ति से file1फिर एक पंक्ति से file2और इसी तरह ...)
don_crissti
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.