Перевірте, чи всі рядки файлу є унікальними


11

У мене є текстовий файл, що містить такі рядки:

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

Як я можу бути впевнений у унікальності кожного рядка?

ПРИМІТКА . Мета - протестувати файл, а не змінювати його за наявності дублікатів.



1
Ви хочете перевірити, чи всі рядки унікальні, чи ви хочете видалити дублікати?
8bittree

1
@ 8bittree - бажаю просто бути впевненим у унікальності
snr

Відповіді:


24
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique

Точно те, що я сказав би, окрім як uniqзамістьsort -u
Nonny Moose

1
Якщо вхід ще не відсортований, uniqце буде великою помилкою; він лише виводить суміжні лінії!
alexis

1
Якщо хтось зацікавлений у винуватцях, а sort <file> | uniq -dдрук дублікатів.
Рольф

25

Рішення Awk:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"

4
+1 Прийнята відповідь зачитується через весь файл двічі, в той час як це припиняється, як тільки в одному прочитанні зустрічається повторюваний рядок. Це також буде працювати з трубним входом, тоді як інші потрібні файли, які він може перечитати.
JoL

Чи не могли б ви засунути echoINTO END?
Ігнасіо Васкес-Абрамс

2
@ IgnacioVazquez-Abrams Насправді немає сенсу в луні. Виконання && echoабо || echoє умовою у відповідях, що вказує на те, що команда робить правильно з кодом статусу виходу. Важлива річ exit(1). В ідеалі ви б користувалися цим, як if has_only_unique_lines file; then ...ні if [[ $(has_only_unique_lines file) = "no dupes" ]]; then ..., це було б нерозумно.
JoL

2
Якщо інші відповіді читають файл двічі для збереження пам’яті, це зчитує весь файл у пам’яті, якщо немає дупів.
Кусалаланда

1
@Kusalananda Хоча це буде читати весь файл у пам’яті, коли немає дупів, використовуючи також sortволю, незалежно від того, є дупи чи ні, правда? Як це збереження пам'яті?
JoL

21

Використання sort/ uniq:

sort input.txt | uniq

Щоб перевірити лише дублікати рядків, скористайтеся -dопцією для uniq. Це покаже лише дублікати рядків, якщо жодні - нічого не буде:

sort input.txt | uniq -d

Це мій гото. Не впевнений, що пропонують інші, більш голосовані відповіді, що цього немає.
користувач1717828

1
Хороша альтернатива видалення дублікатів.
snr

1
Це не робить те, що він хоче. Він хоче знати, чи є дублікати, а не видаляти їх.
Бармар

@Barmar: Хоча це виглядає таким чином, питання все ще незрозуміле. А також коментарі ОП намагаються уточнити.
jesse_b

Невдала редакція, яка додає більше роз'яснень.
Бармар

5

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

3

Я зазвичай 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

Це справді хороша альтернатива. #rez
ЗСШ

2

Якщо немає дублікатів, всі рядки унікальні:

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

Опис: Сортуйте рядки файлів, щоб повторні рядки були послідовними (сортування)
Витягніть всі послідовні рядки, що є рівними (uniq -d).
Якщо є якийсь результат команди вище ( [...]), то ( &&) надрукуйте повідомлення.


2

Це не було б повним без відповіді Perl!

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

Це надрукує кожен не унікальний рядок один раз: тому якщо він нічого не друкує, то у файлу є всі унікальні рядки.


1

Використання 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

Це би сортувало файл двічі, як і прийнята відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.