如何将两个文件的行相加? (bash中的每列数据)

时间:2015-07-24 15:48:04

标签: bash shell awk

例如,

我有两个文件:

file1.log:

123
456
789

file2.log:

123
456
789

我想快速将它们加在一起?

(我的实际文件各有超过一百万行,但行数相等。)

输出结果为:

246
912
1578

6 个答案:

答案 0 :(得分:10)

试试这个:

paste -d + file1.log file2.log | bc

输出:

246
912
1578

答案 1 :(得分:3)

要求救援

awk '{getline t < "file2.log"; print $0+t}' file1.log

答案 2 :(得分:2)

使用awk你可以这样做:

awk 'FNR==NR{a[FNR]=$1; next} {print $1 + a[FNR]}' file1 file2
246
912
1578

答案 3 :(得分:1)

我认为pastebc是最好的解决方案。只是为了好玩,这里有一种方法可以使用纯粹的bash(改编自unix.sx上的this post):

while read n1 <&3 && read n2 <&4; do
  echo $((n1 + n2))
done 3<file1.log 4<file2.log

或者使用-u fd选项read(感谢 rici ):

while read -u3 n1 && read -u4 n2; do
  echo $((n1 + n2))
done 3<file1.log 4<file2.log

输出:

246
912
1578

答案 4 :(得分:1)

这可能是另一种选择

paste file1.log file2.log | awk '{print $1 + $2;}'

#246
#912
#1578

答案 5 :(得分:0)

这是一个Perl解决方案:

perl -lne 'BEGIN{open $in1,shift; open $in2,shift} while($n1=<$in1> and $n2=<$in2>){print $n1+$n2}' file1.log file2.log

更具可读性(但速度稍慢)的版本:

open my $in1, "<", shift;
open my $in2, "<", shift;
while ( my $n1 = <$in1> and my $n2 = <$in2> ) {
    print $n1 + $n2
    print "\n";
}
close($in1);
close($in2);

仅仅为了踢,我对上面列出的所有其他解决方案进行了基准测试 它们都产生相同的输出 输入文件是1到999999之间的整数列表 seq 999999 > file1.log ; seq 999999 > file2.log

基准测试结果(每次10次):

shell@thor                     0.070/s
paste@cyrus                    0.410/s
awk@anubhava                   0.546/s
perl_5.6.1                     1.06/s
paste@veerendra                1.32/s
perl_5.20 (readable version)   1.37/s
awk@karakfa (awk 3.1.5)        1.44/s
perl_5.20                      1.75/s