Печать уникальных строк

Я изучил Unix в дни System V AT&T (1990), и он пошел как это: на комнате-rf/bin/nessus-fetch.rc говорили как: прибытие emm минус наклонная черта мусорного ведра наклонной черты эффективности прибытия nessus выборка тире отмечает точкой дистанционное управление, где минус был индикатор аргумента, и тире был частью имени каталога или имени файла

Я услышал много из минус в мое время, и обычно люди тире были новичками, объявленными noo пчелами :-)

ВОЙНА

15
23.03.2011, 00:29
3 ответа

Распечатать каждую идентичную строку только один, в любом порядке:

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]}'
25
27.01.2020, 19:49
  • 1
    как насчет awk '!seen[$0]++ {print}'? –  asoundmove 23.03.2011, 05:26
  • 2
    Или еще короче awk '!seen[$0]++', начиная с {print} подразумевается пустой командой. спасибо –  quazgar 04.06.2015, 13:23

Некоторые (большинство?) версии sort имейте a -u флаг, который делает uniq отделитесь непосредственно. Могли бы быть некоторые ограничения длины строки в зависимости от реализации, хотя, но у Вас были те, которые уже имеют плоскость sort|uniq.

3
27.01.2020, 19:49
  • 1
    Er? sort -u возвращается к V7, по крайней мере. –  geekosaur 23.03.2011, 00:46
  • 2
    Гул... Я думал, что помнил Солярис или AIX, не имеющий это. Я неправ, хотя, у них обоих есть он. копии –  Mat 23.03.2011, 00:50
  • 3
    и AIX имеют -u но также и имейте ограничение длины строки с 512 символами. (На самом деле я думаю где-нибудь о Солярисе, 9 Sun повысили его к 5 120. GNU все еще побеждает, все же.) –  geekosaur 23.03.2011, 00:52
  • 4
    @geekosaur:вы уверены? работа, сделанная для удаления 512-байтового предела на длину строки в виде, была зарегистрирована в 'Теорию и Практику в Конструкции Рабочей Программы сортировки' J P Linderman, Техническая Система Звонка. Журнал, 63, 1827 - 1843 (1984). –  Jonathan Leffler 23.03.2011, 05:32

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
0
27.01.2020, 19:49
  • 1
    Где $lines определяет? –  Gregg Leventhal 20.07.2014, 06:09
  • 2
    Это не. С тех пор нет a use strict; или use warnings; (на самом деле это strict это является самым релевантным здесь), нет никакой жалобы на использование %lines прежде чем это будет определено. Если бы выполнено с резкой критикой, должна была бы быть строка my %lines; перед циклом. Обратите внимание также, что хеш %lines; на один элемент хеша ссылаются с помощью $lines{$_} нотация. –  Jonathan Leffler 20.07.2014, 07:47
  • 3
    я думаю sort решения могут быть лучше для большого объема данных (OP касался "того, чтобы хранить весь файл в памяти"). sort выполнит вид из ядра, если данные будут больше, чем доступная память. –  Kusalananda♦ 06.04.2017, 11:29

Теги

Похожие вопросы