LINUX.ORG.RU

Удалить строку из txt файла если не нашлось совпадения

 


0

1

Здравствуйте.

Есть много_txt_файлов и еще один с данными. Нужно удалить из файла с данными строку если в много_txt_файлов не нашлось совпадения.

в файле с данными 4000 строк, одно значение в строке, много_txt_файлов 1900 штук, три значения в строке

хочется более менее простого решения, в чем смогу сам разобраться если вдруг понадобится внести изменения

знаю что бесплатно никто не работает) оставите координаты отправлю немного на чтосамирешите)

Спасибо.


Зачем тебе grep и прочие Shell-костыли для этого? Возьми какой-нибудь нормальный ЯП, например, Python и сделай всё с его помощью.

EXL ★★★★★ ()

Нужно удалить из файла с данными строку если в много_txt_файлов не нашлось совпадения.

Может наоборот? Добавлять в новый файл строку если grep пустой?

anonymous ()

Цикл, awk и [ в помощь.

anonymous ()

Попробуй так:

#!/usr/bin/bash

data_file="$1"
many_files_dir="$2"
tmp_file=$(mktemp)

cat "$data_file" | while read line; do
    if grep -Fqr "$line" "$many_files_dir"; then
        echo "$line" >> "$tmp_file"
    fi
done

mv "$tmp_file" "$data_file"

Я не проверял, конечно. И это, по идее, должно работать, только если строки идеально совпадают. Если надо прям значения сравнивать, без учёта пробелов, то такой вариант не подойдёт.

anonymous ()
Ответ на: комментарий от anonymous

Может быть ещё -x стоит добавить к аргументам grep.

anonymous ()

Можно решать задачу по другому.

Читаешь файл построчно и ищешь совпадения в файлах, если нашлось заносить строку в другой новый файл ( в один и тот же).

В конце получаешь новый файл в котором только строки что нашлись.

anonymous ()

… знаю что бесплатно никто не работает)

Почему же?
Многим помогают, кто приводит код и говорит о проблемах.
А те кто просто просят СДЕЛАЙТЕ МНЕ, тех в job /жопу по просто народному/ отсылают …

anonymous ()
Ответ на: комментарий от anonymous

Что-то не взлетает, записывает в новый файл значения из data_file, на этом всё. Строки конечно же не совпадают.

строки в файлах в many_files_dir

76.9.16.1:3510 47.16.38.12:55194 ESTABLISHED 76.9.16.1:35356 19.197.55.71:51152 SYN_SENT

строки в data_file

47.16.38.12 1.1.9.5

по моей задумке в новый файл должен попасть только 47.16.38.12

сможешь что-то с этим сделать?

xohox ()
Ответ на: комментарий от anonymous

Можно в job попросить модератора перенести, но я ж вроде написал, что готов материально отблагодарить.

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

xohox ()
Ответ на: комментарий от xohox

Могу и сам сидеть ковыряться, но, как всегда, нужно сейчас.

Вы анализируете лог файл.
Что вы хотите найти в нем?

anonymous ()
Ответ на: комментарий от xohox

Ну, по логике всё должно быть как ты хочешь. Может быть у тебя файл с данными в той же папке лежит, что и txt-файлы?

anonymous ()
Ответ на: комментарий от xohox

Проверил на вот этих твоих данных сейчас. Структура файлов такая:

./script.sh
./data.txt
./txt/f.txt

Содержимое файлов:

$ cat data.txt 
47.16.38.12
1.1.9.5

$ cat txt/f.txt 
76.9.16.1:3510
47.16.38.12:55194 ESTABLISHED
76.9.16.1:35356
19.197.55.71:51152 SYN_SENT

Запускаем скрипт:

$ ./script.sh data.txt txt

$ cat data.txt
47.16.38.12

То есть пропала запись 1.1.9.5. Так ведь надо было?

anonymous ()
grep -v 'pattern' file > newfile
anonymous ()
Ответ на: комментарий от AKonia

Хочу оставить в data файле только ip с которых подключаются и удалить те, с которых подключения прекратились.

Ругается вот так

./start ./start: line 6: [: too many arguments ./start: line 6: [: too many arguments ./start: line 6: [: too many arguments

шестая строка if [ -z grep -r $w /root/test/ ]

выдает три строки с ошибками, но в data файле четыре строки

cat data 185.155.99.55 37.70.201.228 94.130.57.235 1.1.9.5

в result пусто

xohox ()
Ответ на: комментарий от anonymous

может на телефон отправить? напиши номер в личку, а то ты время тратишь, а пользуюсь я, неправильно это

результат теста, мало ли интересно, из 4000 строк осталось 130) огонь)

xohox ()
Ответ на: комментарий от xohox

Для меня это было несложно. Потратил я минут 5 на то, что мне в было интересно, что в этом неправильного? Но спасибо, что проявляешь ответственность :)

Тот твой огонь из моего окна не видно, к сожалению. А не думал завести БД под свои файлы? Возможно с языком запросов все твои задачи решались бы проще. Или, как тут правильно советуют, попробуй анализатор логов какой-нибудь, там уже должны быть решены все типовые задачи. Какой именно — я тебе не смогу посоветовать, так как сам ими не пользуюсь.

anonymous ()
Ответ на: комментарий от anonymous

Тут какая штука, этот data файл собирался более года. Теперь я его почищу и это снова на год хватит. Анализатор/парсер у меня есть, это perl скрипт, 100 000 строк за одну секунду обрабатывает. Я вот только не знал как убрать уже не используемые.

В БД мне кажется пока нет смысла, но посмотрю конечно, может действительно стоит выкинуть мои костыли и использовать готовое решение.

Спасибо еще раз)

xohox ()
if fgrep -q "pattern" *.txt
then
    sed -i -e 's/string_to_delete//g' file_name
fi

проще некуда, будет долго искать, но работать должно

IvanR ★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.