我一直使用它来删除第一个文件中的第二个文件中的行(差异)。
awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file2.txt file1.txt >output.txt这对于完全相同的行来说是非常完美的,而且它可以快速地处理数百万行的文件。现在,我偶然发现了这样的情况:我的行与第一个文件中的行相似,但不完全相同,一些行的开头有8-9个字符,但它们在一行末尾都是相同的,如下所示:
file1
8952aa182685763d30758c730de536a9907f96e7
5e46468f50df8e410b0372dc8a550c0cec33d8bc
11111111-954f94fa00c220c40a49b37816c9146
5dd0a2058734e2c3e039f3a814fc86789474c65e
2222222-s54b2c1d6176b0aae91d85545670aa7afile2
5e46468f50df8e410b0372dc8a550c0cec33d8bc
954f94fa00c220c40a49b37816c9146
s54b2c1d6176b0aae91d85545670aa7a通缉结果:
8952aa182685763d30758c730de536a9907f96e7
5dd0a2058734e2c3e039f3a814fc86789474c65e我试图找到一个解决方案,但到目前为止我没有,如果您有一个已经解决了的解决方案,共享一个链接,谢谢提前。
发布于 2019-07-09 08:46:03
我相信你真正想要的是:
$ awk -F'-' '(FNR==NR){a[$NF]; next}!($NF in a)' file2 file1这将在由-分隔的字段中分割每一行。因此,对于file1,$NF值由
8952aa182685763d30758c730de536a9907f96e7 -> 8952aa182685763d30758c730de536a9907f96e7
5e46468f50df8e410b0372dc8a550c0cec33d8bc -> 5e46468f50df8e410b0372dc8a550c0cec33d8bc
11111111-954f94fa00c220c40a49b37816c9146 -> 954f94fa00c220c40a49b37816c9146
5dd0a2058734e2c3e039f3a814fc86789474c65e -> 5dd0a2058734e2c3e039f3a814fc86789474c65e
2222222-s54b2c1d6176b0aae91d85545670aa7a -> s54b2c1d6176b0aae91d85545670aa7a这正是您想要从file2中匹配的字符串,因为它包含单个字段,因此也被$NF引用。然而,如果行中自然有更多的连字符,这可能会有问题。
这个可能比grep解决方案更好,因为grep解决方案可能会删除假阳性。想象一下,file1中的线条如下所示:
xxs54b2c1d6176b0aae91d85545670aa7axxxxxx
yyys54b2c1d6176b0aae91d85545670aa7ayyyyy
zzzzs54b2c1d6176b0aae91d85545670aa7azzzz所有这些都会被移除。在上述情况下,情况不会是这样。
您也可以通过以下方式以不同的方式解决问题
不要显示file1的行,file2的行与line1中对应行的末尾相匹配。
使用awk可以通过以下方式解决这一问题:
$ awk '(FNR==NR){a[$0]; next}
{for(str in a) if (index($0,str)+length(str)-1==length($0)) print }' file2 file1我们本可以使用match而不是index,但是match将匹配ERE模式,如果str包含任何特殊的ERE模式,那么它将无法达到它的目的。
发布于 2019-07-09 05:12:57
在file1中查找行而在file2中不进行部分匹配的最简单方法是:
grep -v -f file2 file1其中使用file2中列出的行与file1中的行之间的倒置匹配,结果如下:
8952aa182685763d30758c730de536a9907f96e7
5dd0a2058734e2c3e039f3a814fc86789474c65ehttps://stackoverflow.com/questions/56943334
复制相似问题