修改awk代码

修改awk代码,awk,Awk,如果NV_11.tab中包含的字符串少于两个,我想打印一行输入文件11。现在无法捕获文件11中的字符串,因为正在查找完全匹配的字符串。脚本需要清理才能捕获它们。我尝试在$I旁边添加[^0-9],但似乎这是不允许的 谢谢,伯纳多 awk 'NR==FNR{a[$1]++; next} { c=0; for(i=2;i<=NF;i++){ if($i in a){c++} } }

如果NV_11.tab中包含的字符串少于两个,我想打印一行输入文件11。现在无法捕获文件11中的字符串,因为正在查找完全匹配的字符串。脚本需要清理才能捕获它们。我尝试在$I旁边添加[^0-9],但似乎这是不允许的

谢谢,伯纳多

awk 'NR==FNR{a[$1]++; next}
       {
        c=0;
        for(i=2;i<=NF;i++){
            if($i in a){c++}
        } 

       } 
       c<=1;' NV_1.tab 11

#NV_1.tab
HS302
HS303
HS304
HS305
HS319
HS321
HS322
HS323
HS324
HS326
HS327
HS328
HS329
HS330
HS331
HS332
HPSD74

#11
HPNK_11595  HS302_01873 HS303_01073
HPNK_11596  HPNK_11596  HPS_02673   HS302_01873

#current output
HPNK_11595  HS302_01873 HS303_01073
HPNK_11596  HPNK_11596  HPS_02673   HS302_01873

#desired output
HPNK_11596  HPNK_11596  HPS_02673   HS302_01873
awk'NR==FNR{a[$1]++;next}
{
c=0;

对于(i=2;i我认为最简单的方法就是这样做

在循环添加的

s=$i
gsub(/_.*$/, "", s)

然后将
(a中的$i)
替换为
(a中的s)

您正在尝试将
11
中的单词与
NV_1.tab
中的字符串进行前缀匹配。因此
HS302_01873
匹配
HS302
?当NV_1.tab只有一个匹配项正常时,打印文件11的行,两个或多个不正确。这不是问题。问题是试图找出您想要如何匹配so至于获得您想要的输出。因此,
HPNK_11595; HS302_01873; HS303_01073
测试失败,因为
HS302_01873
匹配
HS302
HS303_01073
匹配
HS303
?同意,这就是为什么HPNK_11595; HS302_01873; HS303_01073不在想要的输出中。可能被误解。我正在尝试前缀匹配t在11Great Response Etan中,他将NV_1.tab中的单词与字符串相对。您正在删除所有从下划线开始的内容,然后将其用作字符串。@Bernardo Right。我能看到的唯一其他选择是放弃在
中使用
,并手动循环在
a
中的字段,这似乎更糟糕,而且几乎可以肯定慢多了。+1和一个小小的吹毛求疵-你只需要
sub()
,而不是
gsub()
.nbd。