Как удалить дубликаты из файла? [dубликат]

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

Например: у меня есть текстовый файл 10 МБ, и я хочу сохранить только одну строку из My line, но где-то в текстового файла есть 2 My line s.

5
задан 20 July 2017 в 06:43

6 ответов

Используя awk

awk '!x[$0]++' infile.txt > outfile.txt

, он работает так, что он подсчитывает количество строк в массиве, а если текущий счет равен нулю, то есть первый случай, он печатает строку, иначе он продолжается до следующего.

10
ответ дан 17 July 2018 в 17:24

Используя awk

awk '!x[$0]++' infile.txt > outfile.txt

, он работает так, что он подсчитывает количество строк в массиве, а если текущий счет равен нулю, то есть первый случай, он печатает строку, иначе он продолжается до следующего.

10
ответ дан 23 July 2018 в 18:13

Существует несколько способов сделать это. Если порядок не важен, сортировка и 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>
5
ответ дан 17 July 2018 в 17:24

Нашел красивый однострочный 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
2
ответ дан 17 July 2018 в 17:24

Существует несколько способов сделать это. Если порядок не важен, сортировка и 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>
5
ответ дан 23 July 2018 в 18:13

Нашел красивый однострочный 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
2
ответ дан 23 July 2018 в 18:13
  • 1
    @terdon да, правильно. Мне понравилась эта идея. – A.B. 28 September 2015 в 17:03
  • 2
    И это имеет смысл для очень длинных строк (вот почему я удалил свой комментарий). Справедливо. – terdon♦ 28 September 2015 в 17:03

Другие вопросы по тегам:

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