Проверить, все ли строки в файле одинаковы

Вы можете привязать клавишу для переключения nicklist и буферного списка, освобождая большую часть реального -пространства экрана,например:

ctrl-F = "/bar toggle nicklist; /bar toggle buflist"
-1
05.08.2019, 10:30
4 ответа

С помощью awk. Сопоставьте имена ключей в массиве unique, и к тому времени, когда вся обработка файла будет завершена, в массиве должен быть только один ключ.

awk '!unique[$0]++ { count++ } END { print count == 1 ? "contents are same" : "contents are different"  }' file

Общий синтаксис для awkпредставляет собой шаблонную -модель действия.

pattern { action }

Часть !unique[$0]++создает хэш-карту (ассоциативного массива )путем создания ключа как содержимого всей строки $0. При первом просмотре уникальной строки значение unique['<key-name>']будет равно нулю, а блок !отменяет это ложное и становится истинным действием для части {..}, где мы увеличиваем счетчик.

Поскольку мы также увеличиваем значение после -, для последующих вхождений той же строки отрицание создаст логическое ложное условие, в результате чего блок {..}не будет выполняться. Инструкции внутри ENDвыполняются после обработки всех строк. Поскольку в конце обработки у нас есть только один ключ в массиве, мы объявляем строки одинаковыми.

1
28.01.2020, 05:06

Использованиеuniq:

uniq -c testfile | [ $(wc -l) -eq 1 ] && echo 'contents are the same' || echo 'contents are different'

4
28.01.2020, 05:06

Пробовал с решением ниже awk, все работало нормально

команда

i=`awk '{if (!seen[$0]++){print $0}}' filename| wc -l`



if [[ $i == 1 ]]; then echo "contents are same"; else echo "contents are different"; fi
1
28.01.2020, 05:06

Все, что вам нужно для краткого, портативного и эффективного сравнения, это:

awk '!seen[$0]++ && NR>1{exit 1}'

Например и с добавленными выходными сообщениями:

$ cat file1
  example-line
  example-line
  example-line

$ cat file2
  example-line
  somethingelse
  example-line

$ awk '!seen[$0]++ && NR>1{f=1; exit} END{print "contents are " (f ? "different" : "same"); exit f}' file1
contents are same
$ echo $?
0

$ awk '!seen[$0]++ && NR>1{f=1; exit} END{print "contents are " (f ? "different" : "same"); exit f}' file2
contents are different
$ echo $?
1
1
28.01.2020, 05:06

Теги

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