Убедитесь, что все строки файла являются уникальными

Не сценарий оболочки, но работает

awk 'BEGIN{for( i=97; i<=122;i++) printf "%c %d\n",i,i }'  

Образец вывода

xieerqi:$ awk 'BEGIN{for( i=97; i<=122;i++) printf "%c %d\n",i,i }' | head -n 5                                    
a 97
b 98
c 99
d 100
e 101
11
06.01.2019, 14:45
8 ответов

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

sort input.txt | uniq

Чтобы проверять только повторяющиеся строки, используйте параметр -dдля uniq. Это покажет только повторяющиеся строки, если нет, ничего не будет отображаться:

sort input.txt | uniq -d
22
27.01.2020, 19:56

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

Я добавил один дубликат к приведенным вами примерам:

$ sort thread.file | uniq -c | sort
      1 This is a thread  139737186379520
      1 This is a thread  139737194772224
      1 This is a thread  139737203164928
      1 This is a thread  139737312270080
      1 This is a thread  139737513694976
      1 This is a thread  139737522087680
      2 This is a thread  139737505302272

Поскольку я давно не читал справочную страницу uniq, я быстро просмотрел любые альтернативы. Следующее устраняет необходимость во второй сортировке, если вы просто хотите увидеть дубликаты:

$ sort thread.file | uniq -d
This is a thread  139737505302272
3
27.01.2020, 19:56

Awk-решение:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"
25
27.01.2020, 19:56

Если нет дубликатов, все строки уникальны:

[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"

Описание :Отсортируйте строки файла, чтобы повторяющиеся строки были последовательными (сортировка)
Извлеките все последовательные строки, равные (uniq -d ).
Если есть какие-либо выходные данные команды выше ([...]), то(&&)напечатать сообщение.

2
27.01.2020, 19:56

Использование cmpи sortвbash:

cmp -s <( sort file ) <( sort -u file ) && echo 'All lines are unique'

или

if cmp -s <( sort file ) <( sort -u file )
then
    echo 'All lines are unique'
else
    echo 'At least one line is duplicated'
fi

Это приведет к сортировке файла дважды, как и в принятом ответе.

1
27.01.2020, 19:56

Это было бы неполным без ответа Perl!

$ perl -ne 'print if ++$a{$_} == 2' yourfile

Каждая не -уникальная строка будет напечатана один раз :, так что если ничего не будет напечатано, значит, в файле есть все уникальные строки.

2
27.01.2020, 19:56
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique
24
27.01.2020, 19:56

TLDR

Первоначальный вопрос был неясен, и читал, что ОП просто хотела уникальную версию содержимого файла. Это показано ниже. В обновленной форме вопроса ОП теперь заявляет, что он / она просто хочет знать, уникально ли содержимое файла или нет.


Проверка уникальности содержимого файла

Вы можете просто использовать sort, чтобы проверить, является ли файл уникальным и содержит ли он дубликаты:

$ sort -uC input.txt && echo "unique" || echo "duplicates"

Пример

Скажем, у меня есть эти два файла:

дубликат файла образца
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
уникальный образец файла
$  cat uniq_input.txt
A
B
C
D

Теперь, когда мы анализируем эти файлы, мы можем сказать, уникальны они или содержат дубликаты:

тестовый файл дубликатов
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
проверить уникальный файл
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique

Исходный вопрос (уникальное содержимое файла)

Можно сделать всего лишьsort:

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680
5
27.01.2020, 19:56

Теги

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