我想删除所有包含某个字符串的行以及接下来的 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 的文本文件中的一行,我想一次匹配一个字符串,每次删除输入文件中匹配的行以及接下来的 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
sed 命令中的 -i 将每个更改添加到临时文件,然后在完成所有更改后,将其移动到输出文件。如果您想直接在输出文件上工作,请执行以下操作:
#!/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