Я хотел бы удалить все строки, содержащие определенную строку, а также следующие 3 строки.
Я могу использовать команду sed, чтобы сделать это легко при использовании единственной строки:
sed '/HISEQ:243:C9FH7ANXX:4:2202:4922:44902/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
Двойная заключенная в кавычки версия также работает:
sed "/HISEQ:243:C9FH7ANXX:4:2202:4922:44902/,+3 d" ../input/infile.fq_1 > ../output/outfile.fq_1
Однако я хотел бы использовать много строк. Каждая строка является строкой в текстовом файле под названием strings.txt, и я хотел бы соответствовать одной строке за один раз, удаляя строки, которые соответствуют в infile, а также следующие 3 каждых раза и запись вывода к outfile.
Таким образом, я попробовал:
cat strings.txt | while read LINE
do
sed '/$LINE/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
done
Но переменная не распознана с одинарными кавычками. Если я использую двойные кавычки:
cat strings.txt | while read LINE
do
sed "/$LINE/,+3 d" ../input/infile.fq_1 > ../output/outfile.fq_1
done
Это не работает также.
Я также попробовал все виды изменений, как использование фигурных скобок или использование обоих типов кавычек:
cat strings.txt | while read LINE
do
sed '/'"$LINE"'/,+3 d' ../input/infile.fq_1 > ../output/outfile.fq_1
done
Но ничто, кажется, не работает. Справка очень ценилась бы!
Проблема здесь состоит в том, что Вы продолжаете переписывать свой выходной файл каждый раз через цикл. Попробуйте это:
#!/bin/bash
cp ../input/infile.fg_1 temp
while read line; do
sed -i "/$line/,+3 d" temp
done < strings.txt
mv temp ../output/outfile.fg_1
-i в sed команде ADDS каждое изменение во временном файле и затем однажды все изменения было внесено, мы перемещаем его в Ваш выходной файл. Если Вы хотели работать непосредственно над выходным файлом, затем делают это:
#!/bin/bash
cp ../input/infile.fg_1 ../output/outfile.fg_1
while read line; do
sed -i "/$line/,+3 d" ../output/outfile.fg_1
done < strings.txt