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