Сравните два файла и добавьте значения, оставьте несоответствия как таковые в выходном файле.

Я пытаюсь сопоставить два файла,file1.txt(50000 строк), file2.txt(55 000 строк). Я хочу добавить файл2 в файл 1, извлечь значения столбцов 2 и 3 и оставить несоответствия как таковые. Выходной файл должен содержать все идентификаторы из file2, т.е. он должен иметь 55000 строк. Примечание. Все идентификаторы в файле 1 отсутствуют в файле file2. т.е. фактические совпадения могут быть менее 50000.

file1.txt

ab1 12 345  
ab2 9 456  
gh67 6 987  

file2.txt

ab2 0 0  
ab1 0 345  
nh7 0 0  
gh67 6 987  

Выход

ab2 9 456  
ab1 12 345  
nh7 0 0  
gh67 6 987 

Это то, что я пробовал, но он печатает только совпадения (поэтому вместо 55 000 строк у меня есть 49 000 строк в моем выходном файле)

awk "NR==FNR {f[$1]=$0;next}$1 in f{print f[$1],$0}" file1.txt file2.txt >output.txt

1 ответ

Решение

Этот скрипт будет работать

NR == FNR {
    a[$1] = $0
    next
}
$1 in a {
    split(a[$1], b)
    print $1, (b[2] == $2 ? $2 : b[2]), (b[3] == $3 ? $3 : b[3])
}
!($1 in a)

Если вы сохраните это как a.awk и запустите

awk -f a.awk foo.txt foo1.txt

Это будет выводить

ab2 9 456
ab1 12 345
nh7 0 0
gh67 6 987
Другие вопросы по тегам