减去一行中的每一列,以获得两个单独文件中的相似行号

时间:2015-08-05 16:44:12

标签: awk

如果我有两个文件:

文件1

2,3,1,4,5,2,1
1,2,4,6,3,1,3
1,2,1,1,1,1,1

file2的

1,1,1,1,1,1,1
1,1,1,1,1,1,1
1,1,1,1,1,1,1

我想从每个文件的相同行号中减去所有数字。因此,文件1中第1行的所有数字减去文件2的第1行的所有数字,依此类推。

输出:

1,2,0,3,4,1,0
0,1,3,5,2,0,2
0,1,0,0,0,0,0

2 个答案:

答案 0 :(得分:3)

$ paste -d, file1 file2 | awk -F, '{n=NF/2; s=""; for (i=1;i<=n;i++) {printf "%s%s", s, $i-$(i+n); s=",";}; print ""}'
1,2,0,3,4,1,0
0,1,3,5,2,0,2
0,1,0,0,0,0,0

如何运作

  • paste -d, file1 file2

    这将逐行合并文件。

  • n=NF/2; s=""; for (i=1;i<=n;i++) {printf "%s%s", s, $i-$(i+n); s=",";}

    这会减去并打印。

  • print ""

    这会在每行的末尾打印换行符。

答案 1 :(得分:0)

您可以将two dimensional arrays与GNU Awk一起使用:

$ cat subtract_fields.awk
BEGIN
{
    FS=OFS=","
}
{
    if(FNR==NR) {
        for(i=1; i<=NF; i++)
            a[FNR][i]=$i
    } else {
        for(i=1; i<=NF; i++)
            $i=a[FNR][i]-$i
        delete a[FNR]
        print
    }
}
$ awk -f subtract_fields.awk file1 file2
1,2,0,3,4,1,0
0,1,3,5,2,0,2
0,1,0,0,0,0,0