Как сравнить два разных файла построчно в unix?

Многие дистрибутивы поддерживают Linux Standard Base. Совместимые дистрибутивы поддерживают команду lsb_release :

lsb_release --codename

Даже без lsb_command часто можно найти

cat /etc/*-release

и поиск в сети для ВЕРСИЯ .

13
17.04.2019, 13:53
6 ответов

Предполагая, что оба файла имеют одинаковое количество строк:

awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1

Это числовое сравнение, если сравниваемые строки являются числами, а в противном случае — лексическими. Например, 100и 1.0e2будут считаться идентичными. Измените на f2"" == $0, чтобы принудительно выполнить лексическое сравнение в любом случае.

В зависимости от реализации awkлексическое сравнение будет выполняться, как если бы использовалосьmemcmp()(сравнение байтов -с -байтами )или как если бы использовалосьstrcoll()(независимо от того, сортируют ли две строки то же самое в порядке сопоставления локали ). Это может иметь значение в некоторых локалях, где порядок неправильно определен для некоторых символов, а не для всех вводов десятичных цифр, как в вашем образце.

10
27.01.2020, 19:52

Питон 3

with open('file1') as file1, open('file2') as file2:
    for line1, line2 in zip(file1, file2):
        print(line1 == line2)

Выход:

True
True
False
False

Если вам нужны TRUEи FALSEв верхнем регистре, замените строку печати одним из этих:

print(str(line1 == line2).upper())
print('TRUE' if line1 == line2 else 'FALSE')
7
27.01.2020, 19:52

В bashчтение из каждого файла в цикле while, сравнение прочитанных строк и печать TRUEили FALSEсоответствующим образом:

while IFS= read -r -u3 line1; IFS= read -r -u4 line2; do
    [[ $line1 == $line2 ]] && echo TRUE || echo FALSE
done 3<file1 4<file2

Два вызова readсчитывают из дескриптора файла 3 и 4 соответственно. Файлы перенаправляются на них с двумя входными перенаправлениями в цикле.

4
27.01.2020, 19:52
Tried with awk command and it worked fine


awk 'NR==FNR{a[$1];next}{if ($1 in a){print "TRUE"} else{print "False"}}' file1 file2

выход

TRUE
TRUE
False
False
0
27.01.2020, 19:52

Используйте команду diff, как показано ниже, в bashили любой другой оболочке, которая поддерживает<(...)замену процессов или , вы можете эмулировать ее, как показано здесь:

diff --new-line-format='FALSE'$'\n' \
     --old-line-format='' \
     --unchanged-line-format='TRUE'$'\n' \
<(nl file1) <(nl file2)

Вывод будет:

TRUE
TRUE
FALSE
FALSE

--new-line-format='FALSE'$'\n', напечатайте FALSE, если строки были разными, и с помощью --old-line-format=''мы отключим вывод, если строки были разными для файла1, который известен как старый файл для команды сравнения (. Мы также можем поменять местами их, что означает, что один из них должен печатать FALSE, другой должен быть отключен.)

--unchanged-line-format='TRUE'$'\n', выведите TRUE, если строки были одинаковыми. синтаксис экранирования в стиле $'\n'C -используется для печати новой строки после вывода каждой строки.

56
27.01.2020, 19:52

Предположим, что файлы не содержат символов табуляции -:

$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE

При этом используется pasteдля создания двух столбцов с разделителями табуляцией -с содержимым двух файлов в каждом столбце. Команда awkсравнивает два столбца в каждой строке и выводит TRUE, если столбцы совпадают, и в противном случае выводит FALSE.

26
27.01.2020, 19:52

Теги

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