it-swarm-ru.tech

Как получить только уникальные результаты без сортировки данных?

$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

В результате мне нужно отобразить все строки из исходного файла, удалив все дубликаты (не только последовательные), сохраняя при этом исходный порядок операторов в файле.

Здесь, в этом примере, результат, который я на самом деле искал, был

aaaaaa
cccccc
bbbbbb

Как я могу выполнить эту обобщенную операцию uniq в целом?

43
Lazer
Perl -ne 'print unless $seen{$_}++' data.txt

Или, если вы должны иметь бесполезное использование cat :

cat data.txt | Perl -ne 'print unless $seen{$_}++'

Вот перевод awk для систем, в которых отсутствует Perl:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
57
cjm

Джон есть инструмент под названием unique:

[email protected] % cat data.txt | unique out
[email protected] % cat out
aaaaaa
cccccc
bbbbbb

Добиться того же без дополнительных инструментов в одной командной строке немного сложнее:

[email protected] % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl печатает номера строк перед строками, поэтому, если мы sort/uniq позади них, мы можем восстановить первоначальный порядок строк. sed просто удаляет номера строк после этого;)

13
binfalse

Я предпочитаю использовать это:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n добавляет номера строк,

sort --key=2.1 -b -u сортирует по второму полю (после добавленных номеров строк), игнорируя начальные пробелы, сохраняя уникальные строки

sort -n сортирует в строгом порядке

cut -c8- сохранить все символы от столбца 8 до EOL (т. е. пропустить добавленные номера строк)

6
menkus

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

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Вы можете прочитать больше об этом модуле здесь: List :: MoreUtils

2
slm