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

Файл $HOME/.profile используется многими оболочками, включая удар, sh, тире и возможно других.

Из страницы справочника удара:

Когда удар вызывается как интерактивная оболочка входа в систему... он сначала читает и выполняет команды из файла/etc/profile, если тот файл существует. После чтения того файла это ищет ~/.bash_profile, ~/.bash_login и ~/.profile, в том порядке, и читает и выполняет команды от первой, которая существует и читаема.

csh и tcsh явно не смотрят на ~/.profile но те оболочки отчасти вытеснены.

40
26.04.2011, 00:15
4 ответа
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]++'
54
27.01.2020, 19:35
  • 1
    немного более короткий awk сценарий { if (!seen[$0]++) print } –  camh 25.04.2011, 01:32
  • 2
    @fred, если Ваш файл не действительно огромен, ни одна версия, занимает больше времени для ввода, чем это делает для выполнения. –  cjm 25.04.2011, 06:32
  • 3
    awk версия может быть сделана еще короче путем игнорирования if, print, круглые скобки и фигурные скобки: awk '!seen[$0]++' –  Gordon Davisson 25.04.2011, 09:29
  • 4
    @Legate, это - название массива, в котором мы записываем каждую строку, которую мы видели. Вы могли изменить его на '!LarryWall[$0]++' для всех уходов о awk, но "замеченный" помогает людям понять программу лучше. –  cjm 17.01.2012, 21:14
  • 5
    @Sadi, который действительно нужно было спросить как вопрос, не комментарий. Но некоторые строки в том конце файла в пространстве, и некоторые не делают. Эти команды считают всю строку значительной, включая пробел в конце. –  cjm 17.05.2014, 20:07

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

usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb

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

usr@srv % 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
27.01.2020, 19:35
  • 1
    является там какой-либо комбинацией общих команд Linux, которые могли сделать то же? –  Lazer 24.04.2011, 23:45
  • 2
    , Что Вы пропускали в, "не имея необходимость сортировать данные"? –  Totor 29.07.2013, 22:00
  • 3
    @Totor - см. ответ menku на подобный комментарий. @binfalse - Ваше второе решение не работает (возможно, это работает с этим тривиальным образцом, но это не работает с некоторым реальным входом). Зафиксируйте это, например, это должно всегда работать: nl -ba -nrz data.txt | sort -k2 -u | sort | cut -f2 –  don_crissti 07.11.2015, 21:33

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

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
27.01.2020, 19:35
  • 1
    >, Как получить только уникальные результаты, не имея необходимость сортировать данные?>, не имея необходимость сортировать данные –  Jan Wikholm 30.07.2013, 09:40
  • 2
    , 'не имея необходимость сортировать данные' только появляется в заголовке. Фактическая потребность к: "отобразите все строки из исходного файла, удаляющего все дубликаты (не только последовательные) при поддержании первоначального порядка операторов в файле". –  menkus 07.08.2013, 21:00

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

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

Можно читать больше об этом модуле здесь: Список:: MoreUtils

2
27.01.2020, 19:35
  • 1
    Это может обработать огромные файлы, например, 500 ГБ? –  Boy 20.12.2017, 21:47

Теги

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