![](/img/trans.png)
[英]Bash compare two different files and get non-matching lines from second
[英]Compare two columns from two different files and print non-matching and new separately
我想比较两个多列 TABBed 文件中的两列(如果需要,可以是 CSV 格式)(第 4 和第 8 列)并分别打印不匹配和新的
table 1 (showing 4th, 8th columns)
100001 28/10/2020
100002 15/03/2017
table 2 (showing 4th, 8th columns)
100001 28/10/2020
100002 18/03/2017
100003 07/12/2018
打印不匹配 // 因为第 8 列中的数据不同(日期,三天后)
100002 18/03/2017
打印新的 // 因为表 1 中不存在该记录
100003 07/12/2018
我尝试了来自 stackoverflow 的不同方法,查看了类似的问题并用谷歌搜索。 这个stackoverflow线程是我发现的最接近的线程,但仍然没有成功
这个单行
awk '{k=$4 FS $8} NR==FNR{a[k]; next} !(k in a)' file1 file2
将输出 new !(k in a) ,但不是不匹配的。 但是,7 行应该打印为新的而不是 5 行。我想知道第 8 列中的日期斜线/是否会影响。 而且,它对不匹配没有帮助。
编辑:根据@ed-morton 建议更新:
user@machine:~/testing$ cat file1
abc 123 456 100001 def ghi 789 28/10/2020
ujl 764 678 100002 htg dcf 065 15/03/2017
user@machine:~/testing$ cat file2
abc 123 456 100001 def ghi 789 28/10/2020
ujl 764 678 100002 htg dcf 065 18/03/2017
rfg 453 287 100003 grf cfe 764 07/12/2018
user@machine:~/testing$ awk 'NR==FNR{a[$4]=$8; next} a[$4] != $8' file1 file2
ujl 764 678 100002 htg dcf 065 18/03/2017
rfg 453 287 100003 grf cfe 764 07/12/2018
这可能是您想要的(未经测试):
awk 'NR==FNR{a[$4]=$8; next} a[$4] != $8' file1 file2
第 8 列或其他任何地方的斜杠或输入中的任何其他特定字符都没有区别,您开始使用的代码和此代码只是进行文字字符串比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.