我这里有一个包含许多行和许多列的文件,我只想保留那些第一次出现模式/字符串的行,但要保留该列中任何重复的字符串/模式的行。
例如
displayIndex
我想删除具有相同起始ID(在ID列中)的行,最多不包括“ _”字符...
例如(脚本运行后)
cat exp.txt
POS ID REF ALT QUAL FILTER
182 3_12 G A . PASS
192 3_22 A A . PASS
199 4_22 G A . PASS
201 10_22 A A . PASS
214 10_35 A G . PASS
220 10_41 C T . PASS
etc......
由于我要删除ID列中不仅具有特定模式,而且具有随后出现的任何模式(最多_字符)的行,因此我不确定如何处理。这有可能吗?
谢谢- LP
答案 0 :(得分:1)
awk '!a[$2]++' FS='[ _]*' exp.txt
答案 1 :(得分:0)
使用关联数组来保存已经看到的键:
{
if (split($2, a, /_/) > 0 )
{
key = a[1]
if (!value[key])
{
value[key] = 1
print $0
}
}
}
答案 2 :(得分:0)
awk
$ cat exp.txt
POS ID REF ALT QUAL FILTER
182 3_12 G A . PASS
192 3_22 A A . PASS
199 4_22 G A . PASS
201 10_22 A A . PASS
214 10_35 A G . PASS
220 10_41 C T . PASS
$ awk ' { split($2,t,"_"); if( ! a[t[1]] ) { print ; a[t[1]]++ } }' exp.txt
POS ID REF ALT QUAL FILTER
182 3_12 G A . PASS
199 4_22 G A . PASS
201 10_22 A A . PASS
答案 3 :(得分:0)
如果在第一个字段中未使用_
,则威廉·珀塞尔(William Pursell)的回答是最好的,如果不是,则在拆分第二个字段后应用相同的概念。请注意,如果该字段中没有_
,则将使用整个值。
$ awk '{split($2,p,"_")} !a[p[1]]++' file
POS ID REF ALT QUAL FILTER
182 3_12 G A . PASS
199 4_22 G A . PASS
201 10_22 A A . PASS
答案 4 :(得分:0)
Perl
$ perl -lane ' $F[1]=~/(.+)_/; print unless $kv{$1}++ ' exp.txt
POS ID REF ALT QUAL FILTER
182 3_12 G A . PASS
199 4_22 G A . PASS
201 10_22 A A . PASS