use*_*849 2 csv shell awk sed bc
我有两个文件,file1.csv
3 1009
7 1012
2 1013
8 1014
Run Code Online (Sandbox Code Playgroud)
和file2.csv
5 1009
3 1010
1 1013
Run Code Online (Sandbox Code Playgroud)
在shell中,我想根据第二列中的标识符,从第一个文件中减去第二个文件中第一列中的计数.如果第二列中缺少标识符,则假定计数为0.
结果将是
-2 1009
-3 1010
7 1012
1 1013
8 1014
Run Code Online (Sandbox Code Playgroud)
文件很大(几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
Run Code Online (Sandbox Code Playgroud)
join将加入已排序的文件.
-j2将加入一个第二列.
-a1即使文件2中没有相应的行,也会从file1打印记录.
-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
Run Code Online (Sandbox Code Playgroud)
将其传送到awk,从第2列中减去第3列,然后重新格式化.
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |