shell - 减去相应的行

标签 shell csv awk sed bc

我有两个文件,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/

相关文章:

awk 匹配同一行中两个文件中的两个字段

bash - 附加到目录中的所有文件名

json - 如何在转换json时增加一个数字

java - JUnitParamsRunner 与输入文件 - 字符串参数问题

JavaScript d3.csv() 给出错误 : read ECONNRESET

bash - 在 bash 中的字母处剪切数字字符串

linux - 如何从 pid 中找到 bash 脚本名称?

python - 为什么两个相同的字符串但以不同的方式连接在使用 python 调用的 shell 上下文中会产生不同的结果?

最后一行没有空值的 Mysql 错误 1261(不包含所有列的数据)

linux - 没有从第一个变量中删除空格