我如何逐行合并文件?

我如何逐行合并文件?

猫文件1

foo
ice
two

猫文件2

bar
cream
hundred

期望输出:

foobar
icecream
twohundred

在我的场景中,file1 和 file2 总是会有相同数量的行,以使事情变得更容易。

答案1

适合这项工作的工具可能是paste

paste -d '' file1 file2

man paste参阅详情。


您也可以使用以下pr命令:

pr -TmJS"" file1 file2

在哪里

  • -T关闭分页
  • -mJ erge 文件,J完整线路
  • -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 解决方案的评论中。)

答案2

通过方式:

awk '{getline x<"file2"; print $0x}' file1
  • getline x<"file2"读取整行文件2并保持X多变的。
  • print $0x打印整行文件1通过使用$0then ,x这是保存的行文件2

答案3

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)))

请注意,对于行数不等的情况,这一行将在最先结束的文件的最后一行结束。

答案4

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

相关内容