Я изучил Unix в дни System V AT&T (1990), и он пошел как это: на комнате-rf/bin/nessus-fetch.rc говорили как: прибытие emm минус наклонная черта мусорного ведра наклонной черты эффективности прибытия nessus выборка тире отмечает точкой дистанционное управление, где минус был индикатор аргумента, и тире был частью имени каталога или имени файла
Я услышал много из минус в мое время, и обычно люди тире были новичками, объявленными noo пчелами :-)
ВОЙНА
Распечатать каждую идентичную строку только один, в любом порядке:
sort -u
Распечатать только уникальные строки, в любом порядке:
sort | uniq -u
Распечатать каждую идентичную строку только однажды, в порядке их первого вхождения: (для каждой строки распечатайте строку, если она еще не была замечена, затем в любом случае увеличьте замеченный счетчик),
awk '!seen[$0] {print}
{++seen[$0]}'
Распечатать только уникальные строки, в порядке их первого вхождения: (запишите каждую строку в seen
, и также в lines
если это - первое вхождение; в конце входа распечатайте строки в порядке возникновения, но только тех замеченных только однажды),
awk '!seen[$0]++ {lines[i++]=$0}
END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'
Некоторые (большинство?) версии sort
имейте a -u
флаг, который делает uniq
отделитесь непосредственно. Могли бы быть некоторые ограничения длины строки в зависимости от реализации, хотя, но у Вас были те, которые уже имеют плоскость sort|uniq
.
-u
но также и имейте ограничение длины строки с 512 символами. (На самом деле я думаю где-нибудь о Солярисе, 9 Sun повысили его к 5 120. GNU все еще побеждает, все же.)
– geekosaur
23.03.2011, 00:52
Perl работает на Вас? Это может сохранить строки в первоначальном заказе, даже если дубликаты не смежны. Вы могли также кодировать его в Python, или awk
.
while (<>) {
print if $lines{$_}++ == 0;
}
Который может быть сокращен только к
perl -ne 'print unless $lines{$_}++;'
Учитывая входной файл:
abc
def
abc
ghi
abc
def
abc
ghi
jkl
Это приводит к выводу:
abc
def
ghi
jkl
use strict;
или use warnings;
(на самом деле это strict
это является самым релевантным здесь), нет никакой жалобы на использование %lines
прежде чем это будет определено. Если бы выполнено с резкой критикой, должна была бы быть строка my %lines;
перед циклом. Обратите внимание также, что хеш %lines
; на один элемент хеша ссылаются с помощью $lines{$_}
нотация.
– Jonathan Leffler
20.07.2014, 07:47
sort
решения могут быть лучше для большого объема данных (OP касался "того, чтобы хранить весь файл в памяти"). sort
выполнит вид из ядра, если данные будут больше, чем доступная память.
– Kusalananda♦
06.04.2017, 11:29
awk '!seen[$0]++ {print}'
? – asoundmove 23.03.2011, 05:26awk '!seen[$0]++'
, начиная с{print}
подразумевается пустой командой. спасибо – quazgar 04.06.2015, 13:23