微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何基于两个文件之间的公共字段使用AWK删除一个文件中的重复行?

我有两个文件

文件1包含3个字段

文件2包含4个字段

文件1的行数比文件2的行数小得多

如何使用awk忽略空白行和注释行

awk – 如何“重新awk”输出

匹配模式,插入模式,直到下一个匹配

可能“循环”和“输出”不能在我的bash脚本中正常工作

如何在单引号包围的awk语句中使用单引号?

我想通过以下操作来比较基于第一个字段的两个文件

如果文件1的任何一行中的第一个字段出现在文件2的一行的第一个字段中,则不要打印该文件2的该行。

任何意见将不胜感激。

Input File 1 S13109 3739 31082 S45002 3800 31873 S43722 3313 26638 Input File 2 S13109 3738 31081 0 S13109 3737 31080 0 S00033 3008 29985 0 S00033 3007 29984 0 S00022 4130 31838 0 S00022 4129 31837 0 S00188 3317 27372 0 S45002 3759 31832 0 S45002 3758 31831 0 S45002 3757 31830 0 S43722 3020 26345 0 S43722 3019 26344 0 S00371 3737 33636 0 S00371 3736 33635 0 Desired Output S00033 3008 29985 0 S00033 3007 29984 0 S00022 4130 31838 0 S00022 4129 31837 0 S00188 3317 27372 0 S00371 3737 33636 0 S00371 3736 33635 0

这是在awk中打​​印最快的方法

添加文本到一行的中间

我可以通过Linux的cut命令改变输出字段的顺序吗?

Linux Bash:使用awk(substr)从文件input中获取参数

在shell中将.txt转换为.csv

awk 'FNR==NR{a[$1]++;next}!a[$1]' file1 file2

怎么运行的:

FNR==NR

当你有两个(或更多)输入文件awk时, NR将在下一个文件的第一行重置为1,而FNR将从其离开的地方继续递增。 通过检查FNR==NR我们本质上是检查是否正在解析第一个文件

a[$1]++

如果我们正在解析第一个文件(见上面),那么创建一个关联数组,其中第一个字段$1作为关键字,然后将值递增1.这基本上让我们创建一个“看到”列表。

next

这个命令告诉awk不要处理任何进一步的命令并读入下一条记录并重新开始。 我们这样做是因为file1只是用来设置关联数组

!a[$1]

这行只在FNR==NR为false时执行,即我们不解析file1,因此必须解析file2。 然后,我们使用file2的第一个字段$1作为索引到我们之前创建的“可见”列表中。 如果返回的值是0,这意味着我们没有在file1中看到它,因此我们应该打印这一行。 相反,如果这个值不是零,那么我们在file1中看到它,所以我们不应该打印它的值。 请注意!a[$1]相当于!a[$1]{print}因为没有给出的认动作是打印整行。

如果您不需要保留行的顺序,则可以在Bash,Korn shell或Z shell中使用进程替换以及join和sort实用程序:

join -v 2 <(sort file_1) <(sort file_2)

如果你使用没有进程替换的shell,你将不得不预先对文件进行排序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐