
У меня есть файл результата A.tsv
(разделитель = \t
):
BC01 2551 99
BC03 2547 95
BC04 2578 99
BC05 2547 97
И файл с образцом информации B.tsv
(разделитель = \t
):
BC01
BC04
BC02
BC03
BC05
И я хочу добавить A.tsv
(но распечатать в новом файле) образец, которого не хватает в B.tsv
:
BC01 2551 99
BC02
BC03 2547 95
BC04 2578 99
BC05 2547 97
До сих пор я пробовал некоторые команды awk, но ничего не вышло:
awk -v OFS="\t" 'NR==FNR{a[$1]=$1;next}{print $0};NR!=FNR{a[$1]=$1;next}{print $1}' B.tsv A.tsv > C.tsv
Вы знаете, как это сделать?
решение1
Правильным подходом к обработке этих файлов было бы декодирование A.tsv
в словарь с ключом $1
, сохранение содержимого всей строки и последующее его использование B.tsv
для поиска значений, например
awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next }
( $1 in arr ){ print arr[$1]; next } { print $1 }' A.tsv B.tsv
Если вы хотите, чтобы конечный результат был отсортирован по $1
, то вам может потребоваться индексировать содержимое обоих файлов и обработать его окончательно, выведя END
только ключ, если значение отсутствует.
awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next }
!( $1 in arr ) { arr[$1] } END { for (x in arr) print arr[x] ? arr[x] : x }' A.tsv B.tsv