Здравствуйте, подскажите пожалуйста - есть список филиалов в файле 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
Вложенный цикл также очень сильно смущает, по моему, он неправильный
удаление строки из файлов
Модератор: Bizdelnick
- Hephaestus
- Сообщения: 3729
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
- Контактная информация:
Re: удаление строки из файлов
Код: Выделить всё
#/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
Это внутренний цикл. Для повторных проверок надо обернуть ещё в один цикл.
Последний раз редактировалось Hephaestus 05.03.2020 10:16, всего редактировалось 2 раза.
Re: удаление строки из файлов
Ну раз уж номера строк в файлах сопоставляются, то можно просто производить поиск по второму файлу и удалять определенную строку в обоих файлах.
Как то так:
В данном примере происходит выход из функции после нахождения и удаления первого совпадения. Остается только добиться повторения этой функции, пока более не будет повторяющихся значений. Если брать приведенный пример, то этого можно добиться заменив вызов функции del_line, на вызов этой функции из другой функции, примерно так:
А далее сами думайте чего хотите, задержки по времени или еще чего.
Как то так:
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
Код: Выделить всё
start_func() {
del_line && start_func
}
start_func