Как я могу сохранить только неповторяющиеся строки в файле?

Я хочу просто сохранить строки, которые не повторяются, в огромном файле, например:

..
a
b
b
c
d
d
..

Тогда желаемый результат:

..
a
c
..

Спасибо заранее.


person git    schedule 24.09.2015    source источник
comment
Разве d не повторяется в последних двух строках?   -  person anubhava    schedule 24.09.2015
comment
ваш файл отсортирован? Вы хотите сохранить порядок строк в файле?   -  person gniourf_gniourf    schedule 24.09.2015
comment
@anubhava Да, извините, отредактируйте. символ .. представляет бесконечные ряды.   -  person git    schedule 24.09.2015
comment
@gniourf_gniourf Я хочу сохранить порядок, чтобы нельзя было использовать сортировку   -  person git    schedule 24.09.2015


Ответы (3)


uniq имеет аргумент -u

  -u, --unique          only print unique lines

Пример:

$ printf 'a\nb\nb\nc\nd\nd\n' | uniq -u
a
c

Если ваши данные не отсортированы, сначала выполните sort

$ printf 'd\na\nb\nb\nc\nd\n' | sort | uniq -u

Сохраняйте порядок:

$ cat foo
d
c
b
b
a
d

$ grep -f <(sort foo | uniq -u) foo
c
a

greps файл шаблонов, полученных вышеупомянутым uniq. Однако я могу себе представить, что если ваш файл действительно огромен, это займет много времени.

То же самое без несколько уродливой подстановки процесса:

$ sort foo | uniq -u | grep -f- foo
c
a
person pacholik    schedule 24.09.2015
comment
Обратите внимание, что printf может принимать несколько аргументов: printf '%s\n' a b c d - person pixelbeat; 24.09.2015
comment
@pacholik Второй отредактированный вариант лучше. Спасибо большое. - person git; 24.09.2015

Этот awk должен отображать только те строки, которые не повторяются в файле:

awk 'seen[$0]++{dup[$0]} END {for (i in seen) if (!(i in dup)) print i}' file
a
c

Просто помните, что исходный порядок строк может измениться из-за хеширования массивов в awk.

EDIT: Чтобы сохранить исходный порядок:

awk '$0 in seen{dup[$0]; next}
     {seen[$0]++; a[++n]=$0}
     END {for (i=1; i<=n; i++) if (!(a[i] in dup)) print a[i]}' file

a
c

Это работа, специально созданная для awk, которая не требует нескольких процессов, каналов и замены процессов и будет более эффективной для больших файлов.

person anubhava    schedule 24.09.2015
comment
Извините, я хочу сохранить порядок остальных строк - person git; 24.09.2015
comment
хорошо, я только что вернулся с работы, обновил ответ, чтобы позаботиться о порядке. Надеюсь, вы прочитали мой комментарий об использовании awk :) - person anubhava; 24.09.2015

Когда ваш файл отсортирован, это просто:

cat file.txt | uniq > file2.txt
mv file2.txt file.txt
person Vrata Blazek    schedule 24.09.2015
comment
Прости, мой провал. uniq -u будет работать хорошо, как упоминалось выше. - person Vrata Blazek; 24.09.2015