字符串匹配并折叠到唯一记录

时间:2014-02-05 04:39:53

标签: 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相同且col7是较长字符串的子集,我想要折叠匹配的col1并将其视为一个实体。

输出:

a  FRNUMBER001  ID1 abcdefgh
b  FRNUMBER003  ID9 lmnopqrstuvw
e  FRNUMBER006  ID7 ablmohuijk

在awk中这会更容易吗?如果使用cnt[$1]++它是相同的,我可以在awk中获取计数器集以添加下一行但我的问题是如何处理awk中的子集场景,比如用什么语法来表示子集?请问任何想法?

2 个答案:

答案 0 :(得分:0)

你可以使用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

请纠正我的理解

答案 1 :(得分:0)

您可以尝试以下内容:

$ cat file
a  FRNUMBER001  ID1 abcdefgh
a  FRNUMBER001  ID2 abcdefg
b  FRNUMBER003  ID3 lmnopqrs
e  FRNUMBER006  ID7 ablmohuijk
b  FRNUMBER003  ID9 lmnopqrstuvw

$ 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

如果需要排序,您可以将输出传递给sort。您必须将$4引用更改为$7,因为您提到它是您希望与之比较的第7列。