У меня есть длинные текстовые файлы с полями, разделенными пробелами:
cat file1.txt
Id leng sal mon
25671 34343 56565 5565
44888 56565 45554 6868
23343 23423 26226 6224
77765 88688 87464 6848
66776 23343 63463 4534
cat file2.txt
Id number
25671 34343
76767 34234
23343 23423
66776 23343
cat output.txt
Id leng sal mon
44888 56565 45554 6868
77765 88688 87464 6848
file1.txt
имеет четыре столбца, file2.txt
имеет два столбца. Я хочу сравнить 1-й столбец ( $1
) в обоих файлах ( file1.txt
, file2.txt
) и вывести файл, который не совпал в file2.txt
.
я пытался
join -v1 file1.txt file2.txt >output.txt
Но в выводе есть некоторые ошибки. Любая команда awk
/ sed
приветствуется.
решение1
Чтобы использовать join
, вам необходимо убедиться, что FILE1 и FILE2 являютсясортированныйна полях соединения.
Следующая команда должна помочь:
join -v1 <(sort file1.txt) <(sort file2.txt)
решение2
Вот так, но без заголовка:
$ awk '{print $1}' file2.txt | grep -vf - file1.txt
44888 56565 45554 6868
77765 88688 87464 6848
Примечание: Я отрегулировал это, чтобы соответствовать примеру вывода, а не вашему описанию. Если вы хотите, чтобы было наоборот, просто поменяйте местами file1 и file2.
Разбираем это подробнее:
awk
печатает только поле 1 изfile2.txt
grep -v
инвертирует совпадение (выводит несовпадающие строки)-f -
сообщает оgrep
необходимости прочитать список шаблонов соответствия из файла, в данном случае-
(STDIN
), который был передан изawk