сопоставить два файла с awk и вывести выбранные поля - PullRequest
0 голосов
/ 24 октября 2018

Я хочу сравнить два файла, разделенных

; 

с одним и тем же полем1, полем вывода2 файла1 и полем2 поля1 файла2.

Файл1:

16003-Z/VG043;204352
16003/C3;100947
16003/C3;172973
16003/PAB4L;62245
16003;100530
16003;101691
16003;144786

File2:

16003-Z/VG043;568E;0540575;2.59
16003/C3;568E;0000340;2.53
16003/PAB4L;568H;0606738;9.74
16003;568E;0000339;0.71
16003TN9/C3;568E;0042261;3.29

Желаемый вывод:

204352;568E;16003-Z/VG043
100947;568E;16003/C3
172973;568E;16003/C3
62245;568H;16003/PAB4L
100530;568E;16003
101691;568E;16003
144786;568E;16003

Моя попытка:

awk -F\, '{FS=";"} NR==FNR {a[$1]; next} ($1) in a{ print a[$2]";"$2";"$3}' File1 File2 > Output

Выше не работает, вероятно, потому что awk все еще неясен для меня,Проблема в том, что движет выходом?какие $1, $2 и т. д. относятся к чему?a[$2] в моем намерении - это поле2 файла 1 .... но это не ...

Что я получаю:

;204352;16003-Z/VG043
;100947;16003/C3
;172973;16003/C3
;62245;16003/PAB4L
;100530;16003
;101691;16003
;144786;16003

спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

При таком подходе файл file_1.txt на first считывается в ассоциативный массив table.(Это делается для того, чтобы связать идентификаторы / значения между файлами.) Затем, зацикливая файл 2 nd file_2.txt, я печатаю значения в table, которые соответствуют полю id этого файла вместе стекущее значение:

BEGIN {
    FS=OFS=";"
    while (getline < first)
        table[$1] = $2 FS table[$1]
}

$1 in table {
    len = split(table[$1], parts)
    for (i=1; i<len; i++)
        print parts[i], $2, $1
}

$ awk -v first=file_1.txt -f script.awk file_2.txt

204352;568E;16003-Z/VG043
172973;568E;16003/C3
100947;568E;16003/C3
62245;568H;16003/PAB4L
144786;568E;16003
101691;568E;16003
100530;568E;16003

0 голосов
/ 24 октября 2018

Это может быть то, что вы после:

awk -F";" '(NR==FNR) { a[$1] = ($1 in a ? a[$1] FS : "") $2; next }
           ($1 in a) { split(a[$1],b); for(i in b) print b[i] FS $2 FS $1 }' file1 file2

Это выводит:

204352;568E;16003-Z/VG043
100947;568E;16003/C3
172973;568E;16003/C3
62245;568H;16003/PAB4L
100530;568E;16003
101691;568E;16003
144786;568E;16003
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...