Awk 字符串匹配并折叠到唯一记录
我有一个8列的文件。这里我只展示了col1,col2,col3,col7Awk 字符串匹配并折叠到唯一记录,awk,Awk,我有一个8列的文件。这里我只展示了col1,col2,col3,col7 a FRNUMBER001 ID1 abcdefgh a FRNUMBER001 ID2 abcdefg b FRNUMBER003 ID3 lmnopqrs e FRNUMBER006 ID7 ablmohuijk b FRNUMBER003 ID9 lmnopqrstuvw 我想折叠匹配的col1,如果col1是相同的,如果col7是较长字符串的子集,则将其视为一个实体 输出: a FRNUMB
a FRNUMBER001 ID1 abcdefgh
a FRNUMBER001 ID2 abcdefg
b FRNUMBER003 ID3 lmnopqrs
e FRNUMBER006 ID7 ablmohuijk
b FRNUMBER003 ID9 lmnopqrstuvw
我想折叠匹配的col1,如果col1是相同的,如果col7是较长字符串的子集,则将其视为一个实体
输出:
a FRNUMBER001 ID1 abcdefgh
b FRNUMBER003 ID9 lmnopqrstuvw
e FRNUMBER006 ID7 ablmohuijk
在awk中,这是否更容易做到?如果使用
cnt[$1]++
相同,我可以在awk中设置计数器来添加下一行,但我的问题是如何处理awk中的子集场景,比如使用什么语法来表示子集?您有什么想法吗?您可以使用awk中的索引功能来实现
cat ip.txt | awk '{if(index($4,$1)>0)printf("%s\n",$0);}'
但我对你的意见有疑问。正如您所说,col1可以等于col7或col7的一个子集,那么您的输入输出应该如下
a FRNUMBER001 ID1 abcdefgh
a FRNUMBER001 ID2 abcdefg
请纠正我的理解您可以尝试以下方法:
$ cat file
a FRNUMBER001 ID1 abcdefgh
a FRNUMBER001 ID2 abcdefg
b FRNUMBER003 ID3 lmnopqrs
e FRNUMBER006 ID7 ablmohuijk
b FRNUMBER003 ID9 lmnopqrstuvw
如果需要排序,可以通过管道将输出传输到
排序
。您必须将$4
参考更改为$7
,因为您提到它是您希望比较的第7列 您不应该将cat
数据发送到awk
,使用awk'{if(index($4,$1)>0)printf(“%s\n”,$0);}'ip.txt
您所说的是正确的。但这只是为了解释逻辑。我知道,但很多人使用这个论坛来学习如何使用这类工具,而且用最好的方式展示它总是很好的习惯:)拉古拉姆先生,对不起,如果我把你弄糊涂了。我的意思是,如果第1列与下一行匹配,那么请看第7列。这是匹配的记录的子集吗?然后给我一个较长的序列,包括那一行的其余部分。因此,在所演示的输出u示例中:FRNUMBER001 ID1 abcdefgh FRNUMBER001 ID2 abcdefg您将给出一个输出:谢谢,这适用于我给出的条件。但是,我也有这样的情况:FRNUMBER001 ID1 abcdefgh FRNUMBER001 ID2 abcdefga FRNUMBER001 ID1 abcdefgh FRNUMBER001 ID2 abcdefg FRNUMBER001 ID11 XvjabcDFGH在这种情况下,我得到的输出是一个FRNUMBER001 ID11 xvjabcdefg。所以我想我应该指定扩展可以是任意一端。我想这有点像集群问题。最好是两端都有扩展,并且至少有一个不匹配的长字符串。有什么评论吗?
$ awk 'a[$1]{b[$1]=index($4,a[$1])>0?$0:b[$1];next}{a[$1]=$4;b[$1]=$0}END{for(x in b) print b[x]}' file
e FRNUMBER006 ID7 ablmohuijk
a FRNUMBER001 ID1 abcdefgh
b FRNUMBER003 ID9 lmnopqrstuvw