bash: Удаление строк из файла

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Demonas666
Сообщения: 25
ОС: Debian GNU/Linux

Re: bash: Удаление строк из файла

Сообщение Demonas666 »

/dev/random писал(а):
31.03.2010 05:10
Demonas666 писал(а):
31.03.2010 05:07
Не хотит. Хотя, если честно, не понимаю почему. Пробую так:
cat src_ | grep -vF pat_
Выводит весь src_ , включая и строки, имеющиеся в pat_

man grep

это я уже читал. Там написано то, что хотел сказать t.t . Но почему-то -F не работает.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: bash: Удаление строк из файла

Сообщение /dev/random »

Demonas666 писал(а):
31.03.2010 05:25
/dev/random писал(а):
31.03.2010 05:10
man grep

это я уже читал. Там написано то, что хотел сказать t.t . Но почему-то -F не работает.

А теперь прочитаёте описание опции -F _внимательно_. И ответьте, сказано ли там хоть что-нибудь про файлы.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: Удаление строк из файла

Сообщение t.t »

sash-kan писал(а):
30.03.2010 23:59
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
cut -f 2- всё же, в строке могут пробелы быть.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: Удаление строк из файла

Сообщение t.t »

/dev/random писал(а):
31.03.2010 00:05
sash-kan писал(а):
30.03.2010 23:59
если файл можно отсортировать, то:
$ sort -u file >otherfile
если уже отсортирован, то:
$ uniq file >otherfile
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
смысл:
1. пронумеровать строки.
2. отсортировать по второму полю и удалить дубликаты.
3. восстановить сортировку по номерам строк.
4. удалить номера строк.

кто придумает короче?
А разве под "дублями" имелись в виду не строки, присутствующие ещё и в другом файле?
cat -n file1 file2 вместо nl.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: Удаление строк из файла

Сообщение drBatty »

lua -e 'a={}; for l in io.lines("exclude.list") do a[l]=true end; for l in io.stdin:lines() do if not a[l] then print(l) end end'


bash: lua: command not found

Согласитесь, это весомый недостаток :(
Когда вы в последний раз в реальной жизни видели статические хеш-таблицы? Сейчас в ходу динамические, которые всегда имеют ровно столько строк, сколько в них записано значений.

в реальной я их вообще не вижу, если честно. Вот 2-3 деревья, или ещё что-то подобное - это да.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: bash: Удаление строк из файла

Сообщение /dev/random »

drBatty писал(а):
31.03.2010 09:29
Согласитесь, это весомый недостаток :(

Для меня тот же недостаток есть в предложенном вами mysql. Причём:

Shell

$ curl -sI http://mirror.yandex.ru/gentoo-distfiles/d...l-5.0.90.tar.gz | grep Len Content-Length: 22299626 $ curl -sI http://mirror.yandex.ru/gentoo-distfiles/d...ua-5.1.4.tar.gz | grep Len Content-Length: 216679

В ~100 раз!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: Удаление строк из файла

Сообщение drBatty »

/dev/random писал(а):
31.03.2010 09:36
drBatty писал(а):
31.03.2010 09:29
Согласитесь, это весомый недостаток :(

Для меня тот же недостаток есть в предложенном вами mysql. Причём:
<...>
В ~100 раз!

да, ессно MySQL есть смысл использовать только если оно УЖЕ установлено (как у меня). Есть и альтернативный вариант - можно использовать как БД файловую систему. В этом есть и плюсы и минусы. Несомненных плюсов 2:
1) ФС есть у всех.
2) Для работы с ФС достаточно shell'а.

Учитывая, что там тоже 2-3дерево (в EXT), то время работы растёт так-же, как и в MySQL (а может и быстрее).

ЗЫЖ
И вообще, на самом деле, решение в данном случае очень сильно зависит от задачи. Иногда проще открыть vim и ручками вырезать :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Demonas666
Сообщения: 25
ОС: Debian GNU/Linux

Re: bash: Удаление строк из файла

Сообщение Demonas666 »

Хе-хе... Ну вот, собственно, и всё... :)
cat src_ | grep -vF "`cat pat_`"

P.S. Дошёл до этого когда написал программулю на си на 50 строчек :blush:
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: bash: Удаление строк из файла

Сообщение Luinnar »

/dev/random писал(а):
31.03.2010 00:25
lua -e 'a={}; for l in io.lines("exclude.list") do a[l]=true end; for l in io.stdin:lines() do if not a[l] then print(l) end end'
Поточно обрабатывает stdin, исключая из него всё, что содержится в файле exclude.list. Быстрее вряд ли кто сделает. И не "портит" порядок строк.

Вот аналог на awk, запускать нужно из bash:

Код: Выделить всё

{ wc -l exclude.list; cat exclude.list; cat input.list; } | awk 'NR==1{num=$1} NR<=num+1{lines[$0]=1} NR>num+1{if(!lines[$0]) print}'

Жаль только, из awk нельзя открыть файл и прочитать список строк для искючения, приходится потоки складывать и кол-во строк считать.

[+] Только и мой и ваш вариант будут расходовать много памяти при большом exclude.list файле.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: Удаление строк из файла

Сообщение drBatty »

Luinnar писал(а):
31.03.2010 17:54
Только и мой и ваш вариант будут расходовать много памяти при большом exclude.list файле.

мой на sed тоже. потому и приводить не буду ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: bash: Удаление строк из файла

Сообщение sash-kan »

t.t писал(а):
31.03.2010 09:08
/dev/random писал(а):
31.03.2010 00:05
sash-kan писал(а):
30.03.2010 23:59
если файл можно отсортировать, то:
$ sort -u file >otherfile
если уже отсортирован, то:
$ uniq file >otherfile
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
смысл:
1. пронумеровать строки.
2. отсортировать по второму полю и удалить дубликаты.
3. восстановить сортировку по номерам строк.
4. удалить номера строк.

кто придумает короче?
А разве под "дублями" имелись в виду не строки, присутствующие ещё и в другом файле?
cat -n file1 file2 вместо nl.
не «вместо», а «вместе». типа так:
$ cat file1 file2 | nl | sort -u -k 2 | sort | cut -f 2 >otherfile

t.t писал(а):
31.03.2010 09:02
sash-kan писал(а):
30.03.2010 23:59
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
cut -f 2- всё же, в строке могут пробелы быть.
не вижу разницы в поведении и при наличии пробелов в строке.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: bash: Удаление строк из файла

Сообщение sash-kan »

Demonas666 писал(а):
31.03.2010 04:47
sash-kan писал(а):
30.03.2010 23:59
если файл можно отсортировать, то:
$ sort -u file >otherfile
если уже отсортирован, то:
$ uniq file >otherfile
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
смысл:
1. пронумеровать строки.
2. отсортировать по второму полю и удалить дубликаты.
3. восстановить сортировку по номерам строк.
4. удалить номера строк.

кто придумает короче?

тут имелось ввиду другое... Не сделать из дублей "не дубли", а полностью удалить те строки, которые повторяются. Т. е. удалить обе строки.
два прохода.
1. собрать дубликаты в отдельный файл (uniq -d).
2. удалить из исходного файла все строки, совпадающие с полученными дубликатами. этот проход вы тут уже подробно разобрали.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: Удаление строк из файла

Сообщение t.t »

sash-kan писал(а):
31.03.2010 21:34
t.t писал(а):
31.03.2010 09:08
/dev/random писал(а):
31.03.2010 00:05
sash-kan писал(а):
30.03.2010 23:59
если файл можно отсортировать, то:
$ sort -u file >otherfile
если уже отсортирован, то:
$ uniq file >otherfile
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
смысл:
1. пронумеровать строки.
2. отсортировать по второму полю и удалить дубликаты.
3. восстановить сортировку по номерам строк.
4. удалить номера строк.

кто придумает короче?
А разве под "дублями" имелись в виду не строки, присутствующие ещё и в другом файле?
cat -n file1 file2 вместо nl.
не «вместо», а «вместе». типа так:
$ cat file1 file2 | nl | sort -u -k 2 | sort | cut -f 2 >otherfile
Я ведь не зря написал не просто cat, а cat -n. Смысл этой опции в точности такой же, что и утилиты nl: пронумеровать строки выходного потока.

sash-kan писал(а):
31.03.2010 21:34
t.t писал(а):
31.03.2010 09:02
sash-kan писал(а):
30.03.2010 23:59
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
cut -f 2- всё же, в строке могут пробелы быть.
не вижу разницы в поведении и при наличии пробелов в строке.
Да, тут ошибся. Не пробелов, а табуляций.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: bash: Удаление строк из файла

Сообщение bormant »

Demonas666 писал(а):
31.03.2010 12:58
cat src_ | grep -vF "`cat pat_`"

cat src_ | fgrep -v -f pat_
cat src_ | grep -vF -f pat_
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: bash: Удаление строк из файла

Сообщение sash-kan »

t.t писал(а):
31.03.2010 23:23
Я ведь не зря написал не просто cat, а cat -n
пардон, проглядел.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Demonas666
Сообщения: 25
ОС: Debian GNU/Linux

Re: bash: Удаление строк из файла

Сообщение Demonas666 »

Вот и первое применение скрипту. Имеется список всех IP, и "белый список" (IP, которым разрешён доступ к серверу). Белых IP уже значительно больше половины, так что есть смысл построить "Чёрный список" вместо белого, ибо меньше :)
Спасибо сказали: