बिल्ली file1
foo
ice
two
बिल्ली file2
bar
cream
hundred
वांछित उत्पादन:
foobar
icecream
twohundred
फ़ाइल 1 और फ़ाइल 2 में हमेशा मेरे परिदृश्य में समान मात्रा में लाइनें होंगी, जो कि चीजों को आसान बनाती हैं।
बिल्ली file1
foo
ice
two
बिल्ली file2
bar
cream
hundred
वांछित उत्पादन:
foobar
icecream
twohundred
फ़ाइल 1 और फ़ाइल 2 में हमेशा मेरे परिदृश्य में समान मात्रा में लाइनें होंगी, जो कि चीजों को आसान बनाती हैं।
जवाबों:
इस नौकरी के लिए सही उपकरण शायद है paste
paste -d '' file1 file2
man paste
विवरण के लिए देखें।
आप pr
कमांड का उपयोग भी कर सकते हैं :
pr -TmJS"" file1 file2
कहा पे
-T
बंद हो जाता है-mJ
एम erge files, J oining full lines-S""
खाली स्ट्रिंग वाले कॉलम को अलग करें यदि आप वास्तव में इसे शुद्ध बैश शेल (अनुशंसित नहीं) का उपयोग करके करना चाहते थे, तो यही मैं सुझाव देता हूं:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(केवल इस सहित क्योंकि विषय एक और प्रस्तावित शुद्ध-बास समाधान के लिए टिप्पणियों में आया था।)
के माध्यम से awk रास्ता:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
फ़ाइल 2 से पूरी पंक्ति पढ़ता है और x चर में रखता है ।print $0x
से पूरे लाइन प्रिंट file1 का उपयोग करके $0
तो x
जिनमें से बचाया लाइन है करें 2 ।paste
जाने का रास्ता है । यदि आप कुछ अन्य तरीकों की जाँच करना चाहते हैं, तो यहाँ एक python
समाधान है:
#!/usr/bin/env python2
import itertools
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
lines = itertools.izip_longest(f1, f2)
for a, b in lines:
if a and b:
print a.rstrip() + b.rstrip()
else:
if a:
print a.rstrip()
else:
print b.rstrip()
यदि आपके पास कुछ पंक्तियाँ हैं:
#!/usr/bin/env python2
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
print '\n'.join((a.rstrip() + b.rstrip() for a, b in zip(f1, f2)))
ध्यान दें कि असमान संख्या की रेखाओं के लिए, यह उस फ़ाइल की अंतिम पंक्ति पर समाप्त हो जाएगा जो पहले समाप्त होती है।
इसके अलावा, शुद्ध के साथ bash
(ध्यान दें कि यह पूरी तरह से खाली लाइनों की उपेक्षा करेगा):
#!/bin/bash
IFS=$'\n' GLOBIGNORE='*'
f1=($(< file1))
f2=($(< file2))
i=0
while [ "${f1[${i}]}" ] && [ "${f2[${i}]}" ]
do
echo "${f1[${i}]}${f2[${i}]}" >> out
((i++))
done
while [ "${f1[${i}]}" ]
do
echo "${f1[${i}]}" >> out
((i++))
done
while [ "${f2[${i}]}" ]
do
echo "${f2[${i}]}" >> out
((i++))
done
mapfile
फ़ाइलों को सरणियों में पढ़ने के लिए उपयोग करें, या दो read
कमांडों के साथ थोड़ी देर के लूप का उपयोग करें , प्रत्येक उनके fd से पढ़ना।
array=( $(cmd) )
या array=( $var )
। mapfile
इसके बजाय उपयोग करें ।
पर्ल रास्ता, समझने में आसान:
#!/usr/bin/perl
$filename1=$ARGV[0];
$filename2=$ARGV[1];
open(my $fh1, "<", $filename1) or die "cannot open < $filename1: $!";
open(my $fh2, "<", $filename2) or die "cannot open < $filename2: $!";
my @array1;
my @array2;
while (my $line = <$fh1>) {
chomp $line;
push @array1, $line;
}
while (my $line = <$fh2>) {
chomp $line;
push @array2, $line;
}
for my $i (0 .. $#array1) {
print @array1[$i].@array2[$i]."\n";
}
के साथ शुरू:
./merge file1 file2
आउटपुट:
foobar
icecream
twohundred