сохранить только строки с первым экземпляром шаблона для нескольких шаблонов - PullRequest
0 голосов
/ 04 января 2019

У меня есть файл с множеством строк и количеством столбцов, и я хотел бы сохранить строки только с первым вхождением шаблона / строки, но для любой повторяющейся строки / шаблона в этом столбце.

, например

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......

И я хотел бы удалить строки, имеющие одинаковый начальный идентификатор (в столбце идентификатора), вплоть до символа "_" ...

например. (после запуска скрипта)

cat post.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

Я не уверен, как подходить из-за того факта, что я хочу удалить строки с последующим вхождением любого шаблона (вплоть до символа _) в столбце идентификатора, а не просто определенного шаблона. Это вообще возможно?

Спасибо - LP

Ответы [ 5 ]

0 голосов
/ 04 января 2019

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
0 голосов
/ 04 января 2019

, если _ не используется в первом поле. Ответ Уильяма Перселла является лучшим, если нет, то же самое понятие применяется после разделения второго поля.Обратите внимание, что если в поле нет _, будет использовано все значение.

$ 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
0 голосов
/ 04 января 2019

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
0 голосов
/ 04 января 2019
awk '!a[$2]++' FS='[ _]*' exp.txt
0 голосов
/ 04 января 2019

Используйте ассоциативный массив для хранения ключей, которые уже были замечены:

{
    if (split($2, a, /_/) > 0 )
    {
        key = a[1]
        if (!value[key])
        {
            value[key] = 1
            print $0
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...