AWK - Как сопоставить столбцы с несколькими совпадениями в файле A с совпадением в файле B - PullRequest
3 голосов
/ 18 апреля 2019

Я пытаюсь найти совпадающие строки между столбцом 1 в файле A и столбцом 2 в файле B и распечатать всю строку файла A + файл B для каждого совпадения.Проблема в том, что в столбце 1 файла A есть несколько строк с одинаковым значением, и когда я использую решение awk, оно печатает только последнее совпадение, а не все совпадения.

Я пытался использовать решение awkЯ использовал ранее для сопоставления уникальных значений в файле A и файле B

awk -vOFS='\t' 'NR==FNR{a[$1]=$0;next} ($2 in a) {print a[$2],$0}' file A file B

Файл A

MLLT3   26.53051423 54.24992354 25.50216856
MLLT3   24.32536694 19.96855016 177.7584507
MLLT3   18.9883621  15.83462512 115.2035222
MLLT3   11.79811105 42.91062427 77.35888553

Файл B

ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522

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

MLLT3   26.53051423 54.24992354 25.50216856 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   24.32536694 19.96855016 177.7584507 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   18.9883621  15.83462512 115.2035222 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522

Фактический результат:

MLLT3   11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.00532152

Я открыт для любого решения, я только что использовал awk для решения подобных проблем в прошлом.

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Поскольку ключи повторяются в файле A, но не в файле B, попробуйте:

$ awk -vOFS='\t' 'NR==FNR{a[$2]=$0;next} ($1 in a) {print $0,a[$1]}' fileB fileA
MLLT3   26.53051423     54.24992354     25.50216856     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
MLLT3   24.32536694     19.96855016     177.7584507     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
MLLT3   18.9883621      15.83462512     115.2035222     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
MLLT3   11.79811105     42.91062427     77.35888553     ENSG00000171843 MLLT3   3.885477052     3.929504522     3.005321522
2 голосов
/ 18 апреля 2019

Я бы вообще не использовал awk для этого.Для чего join предназначен:

$ join -t $'\t' -1 1 -2 2 -o 1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4,2.5 file1.tsv file2.tsv               
MLLT3   26.53051423 54.24992354 25.50216856 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   24.32536694 19.96855016 177.7584507 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   18.9883621  15.83462512 115.2035222 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522
MLLT3   11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3   3.885477052 3.929504522 3.005321522

Предполагается, что файлы отсортированы по соответствующим полям.Если нет:

$ join -t $'\t' -1 1 -2 2 -o 1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4,2.5 <(sort -t $'\t' -k1 file1.tsv) <(sort -t $'\t' -k2 file2.tsv)              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...