$ 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
$
W rezultacie potrzebuję wyświetlić wszystkie wiersze z oryginalnego pliku, usuwając wszystkie duplikaty (nie tylko kolejne), zachowując oryginalną kolejność instrukcji w pliku .
Tutaj, w tym przykładzie, rzeczywiście szukałem wyniku
aaaaaa
cccccc
bbbbbb
Jak mogę ogólnie przeprowadzić tę uogólnioną uniq
operację?
text-processing
uniq
Lazer
źródło
źródło
{ if (!seen[$0]++) print }
if
,print
nawiasy i szelki:awk '!seen[$0]++'
'!LarryWall[$0]++'
na wszystkie awk, ale „widziane” pomaga ludziom lepiej zrozumieć program.john ma narzędzie o nazwie
unique
:Osiągnięcie tego samego bez dodatkowych narzędzi w jednym wierszu poleceń jest nieco bardziej złożone:
nl
wypisuje numery linii przed liniami, więc jeśli mysort
/uniq
za nimi możemy przywrócić pierwotną kolejność linii.sed
po prostu usuwa numery linii;)źródło
nl -ba -nrz data.txt | sort -k2 -u | sort | cut -f2
Wolę użyć tego:
cat -n
dodaje numery linii,sort --key=2.1 -b -u
sortuje według drugiego pola (po dodanych numerach linii), ignorując wiodące spacje, zachowując unikalne liniesort -n
sortuje w ścisłej kolejności numerycznejcut -c8-
zachowaj wszystkie znaki od kolumny 8 do EOL (tzn. pomiń dołączone przez nas numery wierszy)źródło
Perl ma moduł, którego można użyć, który zawiera funkcję o nazwie
uniq
. Jeśli więc dane są ładowane do tablicy w Perlu, wystarczy wywołać taką funkcję, aby była wyjątkowa, ale nadal zachowała pierwotną kolejność.Możesz przeczytać więcej o tym module tutaj: List :: MoreUtils
źródło