Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 字符串匹配并折叠到唯一记录_Awk - Fatal编程技术网

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

Awk 字符串匹配并折叠到唯一记录,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

我有一个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  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