दो या दो से अधिक फ़ाइलों की लाइनों को कैसे इंटरलेव करें?


10

मैंने एक ही फाइल में 2 फाइल आउटपुट प्राप्त करने की कोशिश की है। मैंने कमांड के नीचे कोशिश की है:

cat file1 file2

लेकिन यहाँ file2डेटा के लिए संलग्न है file1

मुझे जो चाहिए वो है file1पहली लाइन के बाद file2पहली लाइन, और file1दूसरी लाइन के बाद file2दूसरी लाइन आदि।

क्या कोई मुझे बता सकता है कि इसे सरल तरीके से कैसे किया जाए?

जवाबों:


17

उसके लिए एक ऐप है!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

अब, यदि आप इन फ़ाइलों को तर्क के रूप में पास करते हैं paste:

$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2

यदि "file1 प्रथम पंक्ति के बाद file2 पहली पंक्ति, और file1 दूसरी पंक्ति उसके बाद file2 दूसरी पंक्ति इत्यादि" है, तो इसका मतलब है कि आप प्रत्येक पंक्ति के बीच एक नई पंक्ति चिपकाएंगे, बस -d(सीमांकक) विकल्प को समायोजित करें ।

$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2

2

पोसिक्स अवाक; यह फाइलों की एक मनमानी राशि के साथ काम करता है, और फाइलों में समान मात्रा में लाइनें भी नहीं होती हैं। स्क्रिप्ट तब तक चलती रहती है जब तक सभी फाइलें लाइनों से बाहर नहीं हो जाती हैं:

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}

इसके साथ एक समस्या है, अगर इनपुट में '%' अक्षर हैं, तो यह प्रिंटफ के अंदर उन्हें निकालने की कोशिश करता है। मेरा अपडेट यह होगा (मुझे यकीन नहीं है कि यह पूरी तरह सही है):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
स्काला विलियम

0

त्वरित बैश समाधान

# Takes as many file arguments as needed
function InterleaveFiles {

    local counter=0
    local hasLine=true

    while [ $hasLine == true ]; do
            hasLine=false
            for i in "$@"; do
                    line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
                    if [ -n "$line" ]; then
                            echo "$line"
                    hasLine=true
                    fi
            done
            counter=$((counter+1))
    done
}

InterleaveFiles file1 file2 file3 file4


-2
paste -d '\n' file1 file2 > file3

कहां file1और file2इनपुट फाइलें हैं और file3निर्मित आउटपुट होंगे।


1
यू एंड एल स्टैक एक्सचेंज में आपका स्वागत है! यह उत्तर टेर्डन के उत्तर के समान है । ऐसे मामलों में जहां आपको लगता है कि आप किसी उत्तर पर सुधार कर सकते हैं, लेकिन नई जानकारी प्रदान नहीं करते हैं, तो कृपया किसी मौजूदा उत्तर को संपादित करने पर विचार करें । मतदान के आधार पर उत्तर भी पुन: व्यवस्थित किए जाते हैं, इसलिए प्रत्येक उत्तर को स्वयं खड़े होना चाहिए या अन्य उत्तर का संदर्भ देना चाहिए। इसीलिए शेल ओनलिनर्स को एक विवरण के साथ होना चाहिए जो उनके ऑपरेशन की व्याख्या करता है।
थॉमस निमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.