Я хочу просто сохранить строки, которые не повторяются, в огромном файле, например:
..
a
b
b
c
d
d
..
Тогда желаемый результат:
..
a
c
..
Спасибо заранее.
Я хочу просто сохранить строки, которые не повторяются, в огромном файле, например:
..
a
b
b
c
d
d
..
Тогда желаемый результат:
..
a
c
..
Спасибо заранее.
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
printf '%s\n' a b c d
- person pixelbeat; 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
, которая не требует нескольких процессов, каналов и замены процессов и будет более эффективной для больших файлов.
awk
:)
- person anubhava; 24.09.2015
Когда ваш файл отсортирован, это просто:
cat file.txt | uniq > file2.txt
mv file2.txt file.txt
d
не повторяется в последних двух строках? - person anubhava   schedule 24.09.2015..
представляет бесконечные ряды. - person git   schedule 24.09.2015