我有两个文件,file1.csv
3 1009
7 1012
2 1013
8 1014
和 file2.csv
5 1009
3 1010
1 1013
在 shell 中,我想根据第二列中的标识符从第一个文件中的计数中减去第二个文件中第一列中的计数。如果第二列中缺少标识符,则假定计数为 0。
结果是
-2 1009
-3 1010
7 1012
1 1013
8 1014
文件很大(几 GB)。第二列已排序。
我如何在 shell 中高效地执行此操作?
最佳答案
假设两个文件都按第二列排序:
$ join -j2 -a1 -a2 -oauto -e0 file1 file2 | awk '{print $2 - $3, $1}'
-2 1009
-3 1010
7 1012
1 1013
8 1014
join
将加入排序的文件。
-j2
将加入第二列。
-a1
将打印 file1 中的记录,即使 file2 中没有相应的行。
-a2
与-a1
相同,但适用于file2。
-oauto
在这种情况下与 -o1.2,1.1,2.1
相同,它将打印连接的列,然后是 file1 和 file2 的剩余列。
-e0
将插入 0
而不是空列。这适用于 -a1
和 -a2
。
join
的输出是三列,如下所示:
1009 3 5
1010 0 3
1012 7 0
1013 2 1
1014 8 0
通过管道传输到 awk,从第 2 列减去第 3 列,然后重新格式化。
关于shell - 减去相应的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41144043/