сравнение двух файлов по строкам

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

cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2

Во-вторых, слейте файлы через позднее слияние и удалите пустые строки.

paste -d'\n' file1 file2 | sed '/^$/d'
0
11.07.2017, 14:27
3 ответа

С awk:

awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' file2 file1

NR==FNR{a[$0];next}:
Для первого файла (файл2 )создайте массив aс ключом $0= целая строка и перейдите к следующей строке. NR — это глобальный номер записи awk, а FNR — номер текущей записи файла. Условие NR==FNR будет действительным только для первого чтения файла (файл2)

(!($0 in a){print}:
Когда первый файл2 завершится, прочитать файл1 и, если вся строка $0файла1 не принадлежит ключам массива a, вывести эту строку.

С grep:

grep -vxF -f file2 file1

-v:поймать не совпадающие строки
-x:соответствует всей строке
-F:сделать фиксированное совпадение вместо сопоставления с образцом
-f:использовать файл2 для загрузки паттернов

Для обновленных данных для построчного сравнения можно использовать awk, а не grep:

awk 'NR==FNR{a[FNR]=$0;next}$0!=a[FNR]{print}' file2 file1
1,2,1,1
1,2,4,2
1,2,1,2

Очевидно, что оба файла должны иметь одинаковое количество строк.

3
28.01.2020, 02:15

Простойcomm(сравнение двух отсортированных файлов построчно )подход:

comm -2 -3 1.txt 2.txt

Выход:

1,2,1,2
1,2,3,3

  • -2-исключить строки столбца 2(, уникальные дляFILE2)

  • -3-подавлять строки столбца 3(, которые появляются в обоих файлах)


Если входные файлы не отсортированы, используйте следующее:

comm -2 -3 <(sort 1.txt) <(sort 2.txt)

----------

Альтернативное решение с использованием инструмента diffс опциями --LTYPE-line-format=LFMT:

diff --unchanged-line-format="" --old-line-format="%L" --new-line-format="" 1.txt 2.txt
  • --unchanged-line-format=""-исключить печать общих строк

  • --new-line-format=""-удалить строки печати из 2-го файла

  • --old-line-format="%L"-вывести важные строки из 1-го файла

3
28.01.2020, 02:15

Просто используйте команду diff:

 diff --suppress-common-lines -n file1 file2

Для ваших примеров файлов выходные данные будут выглядеть следующим образом:

>diff file1 file2
2,3c2,3
< 1,2,1,2
< 1,2,3,3
---
> 1,2,1,1
> 1,2,3,1

< указывает строки из файла1,

> указанные строки из файла2,

= указаны общие для обоих файлов строки

1
28.01.2020, 02:15

Теги

Похожие вопросы