Используйте команду sed с переменной
Я хотел бы удалить все строки, содержащие определенную строку, а также следующие 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, каждый раз и записывая выходные данные в выходной файл.,
Итак, я попробовал:
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
Но, похоже, ничего не работает. Помощь будет высоко ценится!
1 ответ
Проблема здесь в том, что вы продолжаете перезаписывать свой выходной файл каждый раз через цикл. Попробуй это:
#!/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 ДОБАВЛЯЕТ каждое изменение во временный файл, а затем после внесения всех изменений мы перемещаем его в ваш выходной файл. Если вы хотите работать непосредственно с выходным файлом, сделайте это:
#!/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