Как я могу удалить дублирующиеся строки в текстовом файле через командную строку?
Например: у Меня есть текстовый файл 10 МБ, и я хочу сохранить только одну строку My line
, но где-нибудь в текстовом файле существуют 2 My line
s.
Используя awk
awk '!x[$0]++' infile.txt > outfile.txt
путем это работает, то, что это проводит подсчет строк в массиве, и если текущее количество является нулем, т.е. первым происшествием, это печатает строку, иначе это продолжается к следующему.
Существует несколько способов сделать это. Если упорядочивание не важно затем, вид и uniq является самым легким помнить. Однако, если Вы хотите поддержать упорядочивание текстового файла, все же удаляют дубликаты затем awk, добивается цели. Можно также использовать sed, которому я верю.
Вот пример
/tmp/debugSys>cat fileWithDupText.txt
line2
line21
line2
line1
line2
/tmp/debugSys>
/tmp/debugSys>cat fileWithDupText.txt | awk '!a[$0]++'
line2
line21
line1
/tmp/debugSys>sort fileWithDupText.txt | uniq
line1
line2
line21
/tmp/debugSys>sort -u fileWithDupText.txt
line1
line2
line21
/tmp/debugSys>
Найденный хорошей остротой Perl для этого, с помощью md5 хеши ;), но это медленно и только стоит того, если у Вас есть очень длинные строки и огромный файл, где это значительно уменьшит использование памяти:
perl -MDigest::MD5 -ne '$seen{Digest::MD5::md5($_)}++ or print' foo
Поэтому просто используйте
perl -ne '$seen{$_}++ or print' foo
Пример
cat foo
foo
fii
foo bar
foobar
foobar
foo
perl -ne '$seen{$_}++ or print' foo
foo
fii
foo bar
foobar