удаление строки из файлов

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
safronowmax
Сообщения: 103

удаление строки из файлов

Сообщение safronowmax »

Здравствуйте, подскажите пожалуйста - есть список филиалов в файле file1
филиал1
филиал2
филиал3
...

Есть файл file2, который содержит значения в 2 столбцах:
0 1
5 3
8 8
...

Каждая строка из file1 однозначно сопоставляется со строкой из file2
Если значения в одной строке в file2 совпадают, то необходимо удалить соответствующую строку из file1 (в данном случае получается "филиал3") и из file2 (8 8). Далее ждем 5 минут и снова в цикле делаем ту же самую проверку (значения в file2 будут меняться) до тех пор, пока не удалятся все строки из файлов.
Пытаюсь делать так:
while read a b; do
if [[ "$a" = "$b" ]]; then
cat file1 |grep -v ??? \\не пойму, что дописать
cat file2 |grep -v ??? \\не пойму, что дописать
else

sleep 300
while read a b; do
if [[ "$a" = "$b" ]]; then
cat file1 |grep -v ??? \\не пойму, что дописать
cat file2 |grep -v ??? \\не пойму, что дописать
else
:
fi
done <file3
fi
done <file1

Вложенный цикл также очень сильно смущает, по моему, он неправильный
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

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

Сообщение Hephaestus »

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

#/bin/bash
paste file1 file2 | while read a b c; do

if [ "$b" -ne "$c" ]; then
echo $a $b $c
fi

done >file3
cat file3 | awk '{print $1}' >file1
cat file3 | awk '{print $3 " " $2}' >file2
UPD: Сразу не до конца вник в задачу. Поправил.
Это внутренний цикл. Для повторных проверок надо обернуть ещё в один цикл.
Последний раз редактировалось Hephaestus 05.03.2020 10:16, всего редактировалось 2 раза.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2660
ОС: Gentoo

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

Сообщение ormorph »

Ну раз уж номера строк в файлах сопоставляются, то можно просто производить поиск по второму файлу и удалять определенную строку в обоих файлах.
Как то так:
Spoiler

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

#!/bin/bash

del_line() {
   n=0
   while read line
   do
   n=$[++n]
   mass_num=($line)
   if [ "${mass_num[0]}" == "${mass_num[1]}" ] ;  then
      #вывод строки с опред номером
      #cat file2.txt|sed "$n!D"

      #удаление строк с опред номером
      sed "${n}d" -i file1.txt
      sed "${n}d" -i file2.txt
      return 0
   fi
   done <file2.txt
return 1
}

del_line
В данном примере происходит выход из функции после нахождения и удаления первого совпадения. Остается только добиться повторения этой функции, пока более не будет повторяющихся значений. Если брать приведенный пример, то этого можно добиться заменив вызов функции del_line, на вызов этой функции из другой функции, примерно так:

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

start_func() {
   del_line && start_func
}
start_func
А далее сами думайте чего хотите, задержки по времени или еще чего.
Спасибо сказали:
Ответить