Многие дистрибутивы поддерживают Linux Standard Base. Совместимые дистрибутивы поддерживают команду lsb_release :
lsb_release --codename
Даже без lsb_command
часто можно найти
cat /etc/*-release
и поиск в сети для ВЕРСИЯ
.
Предполагая, что оба файла имеют одинаковое количество строк:
awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1
Это числовое сравнение, если сравниваемые строки являются числами, а в противном случае — лексическими. Например, 100
и 1.0e2
будут считаться идентичными. Измените на f2"" == $0
, чтобы принудительно выполнить лексическое сравнение в любом случае.
В зависимости от реализации awk
лексическое сравнение будет выполняться, как если бы использовалосьmemcmp()
(сравнение байтов -с -байтами )или как если бы использовалосьstrcoll()
(независимо от того, сортируют ли две строки то же самое в порядке сопоставления локали ). Это может иметь значение в некоторых локалях, где порядок неправильно определен для некоторых символов, а не для всех вводов десятичных цифр, как в вашем образце.
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')
В 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 соответственно. Файлы перенаправляются на них с двумя входными перенаправлениями в цикле.
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
Используйте команду 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 -используется для печати новой строки после вывода каждой строки.
Предположим, что файлы не содержат символов табуляции -:
$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE
При этом используется paste
для создания двух столбцов с разделителями табуляцией -с содержимым двух файлов в каждом столбце. Команда awk
сравнивает два столбца в каждой строке и выводит TRUE
, если столбцы совпадают, и в противном случае выводит FALSE
.