Не сценарий оболочки, но работает
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
Использование sort
/uniq
:
sort input.txt | uniq
Чтобы проверять только повторяющиеся строки, используйте параметр -d
для uniq. Это покажет только повторяющиеся строки, если нет, ничего не будет отображаться:
sort input.txt | uniq -d
Обычно я 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
Awk-решение:
awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"
Если нет дубликатов, все строки уникальны:
[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"
Описание :Отсортируйте строки файла, чтобы повторяющиеся строки были последовательными (сортировка)
Извлеките все последовательные строки, равные (uniq -d ).
Если есть какие-либо выходные данные команды выше ([...]
), то(&&
)напечатать сообщение.
Использование 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
Это приведет к сортировке файла дважды, как и в принятом ответе.
Это было бы неполным без ответа Perl!
$ perl -ne 'print if ++$a{$_} == 2' yourfile
Каждая не -уникальная строка будет напечатана один раз :, так что если ничего не будет напечатано, значит, в файле есть все уникальные строки.
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique
Первоначальный вопрос был неясен, и читал, что ОП просто хотела уникальную версию содержимого файла. Это показано ниже. В обновленной форме вопроса ОП теперь заявляет, что он / она просто хочет знать, уникально ли содержимое файла или нет.
Вы можете просто использовать 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