Answers:
这项工作的正确工具可能是 paste
paste -d '' file1 file2
有关man paste
详细信息,请参见。
您还可以使用以下pr
命令:
pr -TmJS"" file1 file2
哪里
-T
关闭分页-mJ
米二哥文件,Ĵ oining实线-S""
用空字符串分隔列 如果您真的想使用纯bash shell(不建议这样做),那么我建议这样做:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(仅包括此内容是因为该主题出现在对另一个提议的纯bash解决方案的评论中。)
通过awk方式:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
从file2读取整行并保存到x变量中。print $0x
通过使用then 打印来自file1的整行,这是file2的保存行。$0
x
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)))
请注意,对于不相等的行数,此行将在文件的最后一行(最先结束)处结束。
另外,使用pure 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
命令的while循环,从每个命令读取它们的fd。
array=( $(cmd) )
或array=( $var )
。使用mapfile
代替。
Perl方式,简单易懂:
#!/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