сопоставить один столбец с другим столбцом другого файла Unix - PullRequest
1 голос
/ 09 июля 2019

У меня есть file_1

BlockID
VT11742
VT11744
VT11050
VT11870
VT12147
VT12149
VT12176
VT12180

и file_2

AB Ref2        VICTOR 
crc_31-C1        VT11929
crc_31-C2     VT11929 C2
crc_31-N VT11929 NORMAL
crc_32-C1        VT11050
crc_32-C2     VT11050 C2
crc_33-C1        VT11656
crc_33-C2     VT11656 C2
crc_33-N VT11656 NORMAL
crc_34-C1        VT11981
crc_34-C2     VT11981 C2

Мой желаемый вывод - распечатать первый столбец файла2, когда первый столбец файла1 соответствует файлу2, и распечататьв том же порядке, что и file2, и печатать, когда "нет совпадений"

output

BlockID
VT11742 no_match
VT11744 no_match
VT11050 crc_32-C1
VT11870 no_match
VT12147 no_match
VT12149 no_match
VT12176 no_match
VT12180 no_match

Я думал, что смогу сделать что-то вроде этого grep -Ff file1 file2> output

Ответы [ 3 ]

4 голосов
/ 09 июля 2019

Не могли бы вы попробовать следующее (написано и протестировано с вашими показанными образцами).

awk 'FNR==NR{a[$2]=$1;next} FNR>1{$0=$0 OFS ($1 in a?a[$1]:"no_match")} 1'  file_2  file_1

Вывод будет следующим.

BlockID
VT11742 no_match
VT11744 no_match
VT11050 crc_32-C2
VT11870 no_match
VT12147 no_match
VT12149 no_match
VT12176 no_match
VT12180 no_match
0 голосов
/ 09 июля 2019

Вот еще один awk скрипт. По непонятному запросу. Надеюсь, это работает для вас.

script.awk

FNR == NR { # process file 1 only
    keysArr[$2] = $1; # read each 2nd field into array
    next;   # skip any further handling
}
FNR > 1{    # process file 2 form line 2
    $2 = "no match";   # set default match result
    if ($1 in keysArr) { # match key in file 1
         $2 = keysArr[$1]; # overwrite 2nd output field
    }
}
1           # ouput everything computed for file 2

input.1.txt

BlockID
VT11742
VT11744
VT11050
VT11870
VT12147
VT12149
VT12176
VT12180

input.2.txt

AB Ref2        VICTOR
crc_31-C1        VT11929
crc_31-C2     VT11929 C2
crc_31-N VT11929 NORMAL
crc_32-C1        VT11050
crc_32-C2     VT11050 C2
crc_33-C1        VT11656
crc_33-C2     VT11656 C2
crc_33-N VT11656 NORMAL
crc_34-C1        VT11981
crc_34-C2     VT11981 C2

работает:

awk -f script.awk input.2.txt input.1.txt

выход:

BlockID
VT11742 no match
VT11744 no match
VT11050 crc_32-C2
VT11870 no match
VT12147 no match
VT12149 no match
VT12176 no match
VT12180 no match
0 голосов
/ 09 июля 2019

К print out in the same order of file2, как вы говорите (но не показывайте в своем примере), что вы хотите:

$ awk 'NR==FNR{if (NR==1) print; else a[$1]; next} FNR>1{print $2, ($2 in a ? $1 : "no_match")}' file1 file2
BlockID
VT11929 no_match
VT11929 no_match
VT11929 no_match
VT11050 crc_32-C1
VT11050 crc_32-C2
VT11656 no_match
VT11656 no_match
VT11656 no_match
VT11981 no_match
VT11981 no_match
...