对于多个图案,仅保留具有图案的第一个实例的行

时间:2019-01-03 21:46:45

标签: bash awk sed

我这里有一个包含许多行和许多列的文件,我只想保留那些第一次出现模式/字符串的行,但要保留该列中任何重复的字符串/模式的行。

例如

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

5 个答案:

答案 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