首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除类似的行?

删除类似的行?
EN

Stack Overflow用户
提问于 2019-07-08 22:41:09
回答 2查看 65关注 0票数 1

我一直使用它来删除第一个文件中的第二个文件中的行(差异)。

代码语言:javascript
复制
awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file2.txt file1.txt >output.txt

这对于完全相同的行来说是非常完美的,而且它可以快速地处理数百万行的文件。现在,我偶然发现了这样的情况:我的行与第一个文件中的行相似,但不完全相同,一些行的开头有8-9个字符,但它们在一行末尾都是相同的,如下所示:

file1

代码语言:javascript
复制
8952aa182685763d30758c730de536a9907f96e7
5e46468f50df8e410b0372dc8a550c0cec33d8bc
11111111-954f94fa00c220c40a49b37816c9146
5dd0a2058734e2c3e039f3a814fc86789474c65e
2222222-s54b2c1d6176b0aae91d85545670aa7a

file2

代码语言:javascript
复制
5e46468f50df8e410b0372dc8a550c0cec33d8bc
954f94fa00c220c40a49b37816c9146
s54b2c1d6176b0aae91d85545670aa7a

通缉结果:

代码语言:javascript
复制
8952aa182685763d30758c730de536a9907f96e7
5dd0a2058734e2c3e039f3a814fc86789474c65e

我试图找到一个解决方案,但到目前为止我没有,如果您有一个已经解决了的解决方案,共享一个链接,谢谢提前。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-09 08:46:03

我相信你真正想要的是:

代码语言:javascript
复制
$ awk -F'-' '(FNR==NR){a[$NF]; next}!($NF in a)' file2 file1

这将在由-分隔的字段中分割每一行。因此,对于file1,$NF值由

代码语言:javascript
复制
8952aa182685763d30758c730de536a9907f96e7 -> 8952aa182685763d30758c730de536a9907f96e7
5e46468f50df8e410b0372dc8a550c0cec33d8bc -> 5e46468f50df8e410b0372dc8a550c0cec33d8bc
11111111-954f94fa00c220c40a49b37816c9146 -> 954f94fa00c220c40a49b37816c9146
5dd0a2058734e2c3e039f3a814fc86789474c65e -> 5dd0a2058734e2c3e039f3a814fc86789474c65e
2222222-s54b2c1d6176b0aae91d85545670aa7a -> s54b2c1d6176b0aae91d85545670aa7a

这正是您想要从file2中匹配的字符串,因为它包含单个字段,因此也被$NF引用。然而,如果行中自然有更多的连字符,这可能会有问题。

这个可能比grep解决方案更好,因为grep解决方案可能会删除假阳性。想象一下,file1中的线条如下所示:

代码语言:javascript
复制
xxs54b2c1d6176b0aae91d85545670aa7axxxxxx
yyys54b2c1d6176b0aae91d85545670aa7ayyyyy
zzzzs54b2c1d6176b0aae91d85545670aa7azzzz

所有这些都会被移除。在上述情况下,情况不会是这样。

您也可以通过以下方式以不同的方式解决问题

不要显示file1的行,file2的行与line1中对应行的末尾相匹配。

使用awk可以通过以下方式解决这一问题:

代码语言:javascript
复制
$ 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模式,那么它将无法达到它的目的。

票数 3
EN

Stack Overflow用户

发布于 2019-07-09 05:12:57

file1中查找行而在file2中不进行部分匹配的最简单方法是:

代码语言:javascript
复制
grep -v -f file2 file1

其中使用file2中列出的行与file1中的行之间的倒置匹配,结果如下:

代码语言:javascript
复制
8952aa182685763d30758c730de536a9907f96e7
5dd0a2058734e2c3e039f3a814fc86789474c65e
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56943334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档