поиск общих строк между двумя файлами с помощью awk - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть 2 текстовых файла, которые называются один и два, как эти 2 примера:

один:

chr5    315038  315059  PDCD6
chr5    315039  315059  PDCD6
chr5    315035  315136  AHRR
chr5    315010  315111  AHRR
chr5    315032  315133  AHRR

два:

chr5    315035  315059  PDCD6
chr5    315035  315136  AHRR
chr12   49314934    49315035    CCDC65

Я хочу получить похожиестроки этих 2 файлов основаны на 4 столбцах.например, для файлов один и два ожидаемый результат будет выглядеть следующим образом, поскольку эта строка в двух файлах (для всех столбцов) абсолютно одинакова.

ожидаемый результат:

chr5    315035  315136  AHRR

Я пытаюсь сделать это в awk, используя следующую команду, но результат не тот, который я хочу.ты знаешь как это исправить?

awk 'FNR==NR{a[$1$2$3$3]++;next}!a[$4$3$2$1]' one.txt two.txt > result.txt

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Как указано ravindersingh13 , вы можете выбрать awk для решения вашей проблемы:

Следующий скрипт awk делает то же самое:

$ awk 'NR==FNR{a[$0]++;next} a[$0]' one two
chr5    315035  315136  AHRR

Этот подход не требует сортировки файлов, однако он потребляет больше памяти, поскольку строки хранятся в ассоциативном массиве.Большее потребление памяти, но более быстрый результат для больших файлов (поскольку их не нужно сортировать).

Если вы хотите более прямой подход, вы можете использовать либо comm:

$ comm -1 -2 <(sort one) <(sort two)
chr5    315035  315136  AHRR

инструмент, который сравнивает два отсортированных файла построчно

или grep с использованием опции -f (первый файл будет определять список шаблонов, которые grep будет использовать для запроса второго файла)

$ grep -f one two
chr5    315035  315136  AHRR

-f FILE, --file=FILE Получать шаблоны от FILE, по одному на строку.Если этот параметр используется несколько раз или в сочетании с параметром -e (--regexp), выполните поиск всех указанных шаблонов.Пустой файл содержит ноль шаблонов и поэтому ничего не соответствует.

0 голосов
/ 30 декабря 2018

Вы можете попробовать Perl Solution

$ cat user10657934_one.txt
chr5    315038  315059  PDCD6
chr5    315039  315059  PDCD6
chr5    315035  315136  AHRR
chr5    315010  315111  AHRR
chr5    315032  315133  AHRR

$ cat user10657934_two.txt
chr5    315035  315059  PDCD6
chr5    315035  315136  AHRR
chr12   49314934    49315035    CCDC65

$ perl -lne ' push @{$kv{$_}} ,$ARGV ; END { for(keys %kv) { print "$_" if scalar(@{$kv{$_}}>1) } } ' user10657934_one.txt user10657934_two.txt
chr5    315035  315136  AHRR

или

$ perl -lne ' $kv{$_}.="$ARGV;" ; END { for(keys %kv) { print "$_" if $kv{$_}=~/;.*;/ } } ' user10657934_one.txt user10657934_two.txt
chr5    315035  315136  AHRR
0 голосов
/ 24 декабря 2018

Если вы хотите проверить всю строку, попробуйте выполнить следующее.

awk 'FNR==NR{a[$0];next} $0 in a'  one  two
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...