Как удалить повторяющиеся строки в текстовом файле с помощью командной строки?
Например: у меня есть текстовый файл 10 МБ, и я хочу сохранить только одну строку из My line, но где-то в текстового файла есть 2 My line s.
Используя awk
awk '!x[$0]++' infile.txt > outfile.txt
, он работает так, что он подсчитывает количество строк в массиве, а если текущий счет равен нулю, то есть первый случай, он печатает строку, иначе он продолжается до следующего.
Используя 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
Существует несколько способов сделать это. Если порядок не важен, сортировка и 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