- unixforum.org
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Re: [РЕШЕНО] Удалить повторяющиеся строки
- Linux — удалить дубликаты строк в файле
- Сортировка и поиск дубликатов
- Запись результата в тот же файл
- How to remove duplicate lines inside a text file?
unixforum.org
Система — это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение /dev/random » 08.06.2014 13:07
Если эти повторяющиеся строки всегда идут подряд, используйте uniq. Если нет — sort -u. Если во втором случае нужно, чтобы порядок строк сохранялся (sort, как ясно из имени, их отсортирует), то пронумеруйте строки, отсортируйте с удалением дублей без учёта номера (см. опцию -k), отсортируйте оставшиеся по номеру и удалите номера с помощью sed или cut.
PS: Варианты, что я перечислил, вычистят все повторы, а не только те строки, что повторяются более _двух_ раз. Но что-то мне подсказывает, что вы имели в виду более _одного_ раза.
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение newsrc » 08.06.2014 13:15
Нет, именно повторы более двух раз, т.е. если строка встречается дважды, то её не удалять.
Нашёл вот такую дикую строку:
Система — это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение /dev/random » 08.06.2014 13:39
Нет, именно повторы более двух раз, т.е. если строка встречается дважды, то её не удалять.
Нашёл вот такую дикую строку:
А вам не надо оставлять этот экземпляр? Всё страннее и страннее. Ну ладно.
Предполагаю, что все дубли идут подряд. Если нет, приведите текст к такому виду с помощью sort.
* с помощью uniq -c замените каждую серию дублей на длину серии и строку
* затем sed’ом замените: s/^ *2 \(.*\)/\1\n\1/ (т.е. раскройте «2 строка» в «строка \n строка»)
* им же удалите из строк s/^ *1 //
* им же (или grep’ом) удалите все остальные строки
Можно в другом порядке, если удобно.
SLEDopit Модератор Сообщения: 4814 Статус: фанат консоли (= ОС: GNU/Debian, RHEL
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение SLEDopit » 08.06.2014 14:10
/dev/random
У uniq есть опция -u, которая просто выведет все уникальные строки. Не нужно плясок с sed’ами/grep’ами.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don’t do mistakes, the more bugs are in your code.
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение /dev/random » 08.06.2014 14:12
/dev/random
У uniq есть опция -u, которая просто выведет все уникальные строки. Не нужно плясок с sed’ами/grep’ами.
Я знаю, но в том-то и дело, что ТС это не подходит. Строки, встречающиеся 2 раза, ему удалять не нужно.
SLEDopit Модератор Сообщения: 4814 Статус: фанат консоли (= ОС: GNU/Debian, RHEL
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение SLEDopit » 08.06.2014 14:46
Ой, да, что-то я невнимательно прочитал, виноват.
Ну тогда, могу предложить решения для случая, если важно не нарушать порядок и размер файла относительно небольшой:
суть работы примерно такая:
создаётся массив, куда вносится весь файл (aprint), второй массив, куда вносятся строки, которые встречались хоть раз ( seen ) и третий массив, где строки, которые встречались дважды ( twice ). Если строка встречается 3 и более раз, она удаляется из seen. В конце печатаются все пересечения из seen и aprint, которые и будут искомыми строками.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don’t do mistakes, the more bugs are in your code.
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение newsrc » 09.06.2014 09:13
#/bin/sh foo() < while read line; do MATCH=`cat "$" | grep "$" | wc -l` if [[ $ -le 2 ]]; then echo "$" fi done < "$" > TMP=`foo "$"` echo "$" > $
Да, постоянно делает cat файла, но размер в несколько строк позволяет так сделать.
Скрипту в качестве параметра передаётся имя файла.
Система — это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
SLEDopit Модератор Сообщения: 4814 Статус: фанат консоли (= ОС: GNU/Debian, RHEL
Re: [РЕШЕНО] Удалить повторяющиеся строки
Сообщение SLEDopit » 09.06.2014 12:17
можно заменить на grep -c «$line» «$1». а ещё лучше на grep -c «^$line$» «$1», иначе могут быть лишние совпадения.
ну и да, построчная обработка файла на чистом bash’e всегда существенно дольше всяких sed’ов/awk’ов.
у вас, правда, файл, судя по всему маленький. но если размер вырастет, будет тяжело.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don’t do mistakes, the more bugs are in your code.
Linux — удалить дубликаты строк в файле
Напоминалка. Если нам нужно удалить из файла дубликаты строк, то нельзя использовать операторы перенаправления «>» или «>>». Такие операторы имеют более высокий приоритет и начинают писать в файл ещё до того, как полностью считали из него же все строки.
Ну, как нельзя, можно, если использовать промежуточный файл, но это некрасиво.
На помощь приходят инструменты: tee, sponge (из пакета moreutils), sed -i, awk и другие инструменты записи в файл.
Сортировка и поиск дубликатов
Давайте сначала разберём пару способов поиска дубликатов строк.
Если у нас строки в файле уже отсортированы, то вычистить дубликаты можно командой uniq. Имеем файл test.txt:
cat test.txt | uniq или uniq test.txt
Если у нас строки в файле не отсортированы, то нужно сортировать, например с sort. Имеем файл test.txt:
cat test.txt | sort | uniq или sort test.txt | uniq или sort -u test.txt
С сортировкой и вычищением дубликатов разобрались.
Запись результата в тот же файл
А теперь самое интересное. Нам нужно сохранить результат в тот же самый файл. Операторы перенаправления можно использовать в данном случае только с промежуточным файлом, например:
sort -u test.txt > test.tmp mv -f test.tmp test.txt или одной строкой sort -u test.txt > test.tmp; mv -f test.tmp test.txt
Можно использовать губку sponge, которая накапливает весь вывод перед вводом:
apt-get install moreutils sort -u test.txt | sponge test.txt
Можно использовать тройник tee:
sort -u test.txt | tee test.txt или без вывода на экран sort -u test.txt | tee test.txt >/dev/null
И самый, на мой взгляд, оптимальный метод вывода в файл без перенаправления:
How to remove duplicate lines inside a text file?
A huge (up to 2 GiB) text file of mine contains about 100 exact duplicates of every line in it (useless in my case, as the file is a CSV-like data table). What I need is to remove all the repetitions while (preferably, but this can be sacrificed for a significant performance boost) maintaining the original sequence order. In the result each line is to be unique. If there were 100 equal lines (usually the duplicates are spread across the file and won’t be neighbours) there is to be only one of the kind left. I have written a program in Scala (consider it Java if you don’t know about Scala) to implement this. But maybe there are faster C-written native tools able to do this faster? UPDATE: the awk ‘!seen[$0]++’ filename solution seemed working just fine for me as long as the files were near 2 GiB or smaller but now as I am to clean-up a 8 GiB file it doesn’t work any more. It seems taking infinity on a Mac with 4 GiB RAM and a 64-bit Windows 7 PC with 4 GiB RAM and 6 GiB swap just runs out of memory. And I don’t feel enthusiastic about trying it on Linux with 4 GiB RAM given this experience.
this will destroy your ordering but,have you tried sort -u, I have no idea how or if it can run on such a massive file
C is often not significantly faster than Java, and if you’re running it (in-order) now, there’s a fair chance it’ll finish before you get an answer here, implement it, and it finishes running; out of order, sort -u will probably be faster.