Самым простым подходом будет позднее слияние или застежка-молния. Предположим, что последним символом каждой строки является пробел. Сначала разделите файл на две части по столбцам, которые вы хотите вырезать.
cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2
Во-вторых, слейте файлы через позднее слияние и удалите пустые строки.
paste -d'\n' file1 file2 | sed '/^$/d'
С 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
Очевидно, что оба файла должны иметь одинаковое количество строк.
Простой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-го файла
Просто используйте команду 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,
= указаны общие для обоих файлов строки