AWK, сравнивающий два столбца в двух файлах, выводит совпадающую строку - пропущенные строки из совпадений - PullRequest
0 голосов
/ 15 мая 2018

У меня есть два txt-файла (с разделителями табуляции), я пытаюсь сравнить с awk. Я хочу сравнить столбец 1 файла1 с столбцом 5 файла2, и каждый раз, когда строка из файла1 столбца 1 совпадает с файлом2, столбец 5, я хочу напечатать (в конце концов, в новый текстовый файл) всю строку файла2. В файле 1 имеется около 14000 строк с одним столбцом и 40000 строк с 6 столбцами в файле2. Ниже приведены некоторые тестовые файлы, которые я использовал, чтобы попытаться выяснить, как использовать awk для получения желаемого результата.

file1

AAGAB
AAK1
AAMDC
AAMP
AAR2
AARD
AARS

file2

chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +
chrX    30233674    30238206    NM_002364   MAGEB2  +
chrX    30261847    30270155    NM_002363   MAGEB1  +

Я попытался принять некоторые другие вопросы по awk с похожим желаемым результатом из-за обилия похожих вопросов по awk на SO:

awk -F '\t' 'NR==FNR{c[$1]++;next}c[$5]' file1 file2

Но я получаю только одно совпадение для строки AARS, хотя в тестовых файлах есть и другие совпадения:

chr1    210111518   210337633   NM_001146262    AARS    +

Вывод, который я ищу:

chr14   94463615    94473898    NR_024182   AAGAB   +
chr10   74033676    74035797    NM_019058   AAK1    +
chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +

Я пытался принять пару других сообщений на стеке, но продолжаю получать один и тот же вывод только в 1 совпадении, хотя существует несколько других:

awk для сопоставления file1 с file2 и выходных совпадений

awk -F '\t' 'NR==FNR{c[$1]; next} ($5 in c)' file1 file2

Найти строки с одинаковым значением в столбце в двух файлах

awk -F '\t' 'NR==FNR{A[$1];next}$5 in A' file1 file2

Сравнение двух столбцов в двух файлах с использованием awk

awk -F '\t' 'FNR==NR {a[$1];next} {for (i in a) if ($5~i) print}' file1 file2

Может кто-нибудь помочь мне понять, где работает моя строка awk?

Я сейчас использую GNU Awk 4.2.1, API: 2.0

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Считать из file1 в ассоциативный массив. Затем прочитайте file2 и для каждой строки ищите совпадение.

$ awk 'BEGIN{while(getline line<"file1") {x[line]="1";}} {for (i=1;i<=NF;i++) if(x[$i]) {print; break} }' file2
chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +
0 голосов
/ 16 мая 2018

Я думаю, что у вас это почти получилось ... Я проверил - и следующее работает для меня.

awk -F '\t' 'BEGIN { split("", a) } NR == FNR { a[$0] = 1; next } $5 in a' file1 file2

Результат (вывод в вашем примере не соответствует file2):

chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +

Возможно, что-то не так с FS, я полагаю ... Выможет попытаться сделать так, чтобы FS ударил как по пробелу, так и по табуляции, а также попытаться удалить из беспорядка невидимых и непечатных символов?

awk -F '[[:blank:]]+' '
    BEGIN { split("", a) }
    NR == FNR {
        gsub(/[^[:graph:]]/, "")
        a[$0] = 1
        next
    }
    {
        p = $5
        gsub(/[^[:graph:]]/, "", p)
    }
    p in a' file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...