Bash 我想从另一个列表中删除一个列表中包含的所有内容,以及从另一个文件中删除下一行

Bash 我想从另一个列表中删除一个列表中包含的所有内容,以及从另一个文件中删除下一行,bash,awk,sed,grep,Bash,Awk,Sed,Grep,我想将一个列表中包含的所有内容与下一行一起从另一个列表中删除。例如: list2.txt包含: A D >A AAAAA >B GGGGG >C CCCC >D TTTT list1a.txt包含: A D >A AAAAA >B GGGGG >C CCCC >D TTTT 我期望得到以下结果: >B GGGGG >C CCCC 其中>A和>D已与其下方的线条一起删除 我试过: input=$1 file_t

我想将一个列表中包含的所有内容与下一行一起从另一个列表中删除。例如: list2.txt包含:

A
D
>A
 AAAAA
>B
 GGGGG
>C
 CCCC
>D
 TTTT
list1a.txt包含:

A
D
>A
 AAAAA
>B
 GGGGG
>C
 CCCC
>D
 TTTT
我期望得到以下结果:

>B
GGGGG
>C
CCCC
其中>A和>D已与其下方的线条一起删除

我试过:

input=$1
file_to_edit=$2
while IFS= read -r var
do
echo $var
sed "s/$var//g" $file_to_edit >f2.txt
done < "$input"
正如预期的那样,它返回已删除的“D”,但不返回A,也不返回它们下面的行。 我需要从中删除第一个列表中包含的任何行 第二个文件及其下面的行。
使用
GNU-sed

$ sed 's|.*|/^>&$/,+1d|' f1
/^>A$/,+1d
/^>D$/,+1d
$ sed -f <(sed 's|.*|/^>&$/,+1d|' f1) f2
>B
 GGGGG
>C
 CCCC
  • 此处
    N
    命令用于将下一行添加到图案空间。然后它们被删除。对于另外两行,使用
    N;N
    三用
    N;NN
    等等

使用
awk

如果在
f2中只找到一个匹配项

awk 'NR==FNR{a[">"$0];next} ($0 in a) && (getline x)>0{delete a[$0];next} 1' f1 f2

下面的
awk
也可以帮助您解决同样的问题

awk 'FNR==NR{a[$0]=$0;next} /^>/{c=$0;sub(/^>/,"",c)} (c in a){getline;next} 1' list2.txt list1a.txt
输出如下

>B
 GGGGG
>C
 CCCC
cp 2.txt/tmp/temp1
读var时
做
echo$var
sed's,“$var”,,g'/tmp/temp1>/tmp/temp2
mv-f/tmp/temp2/tmp/temp1
完成<1.txt
cp/tmp/temp1 3.txt

读取变量时
做
echo“s/”$var//g“>>sed.script2
完成<1.txt
sed--file=sed.script2 2.txt>3.txt
rm-f sed.script
>B
 GGGGG
>C
 CCCC
cp 2.txt /tmp/temp1
while read var
do
echo $var
sed 's,'"$var"',,g' /tmp/temp1 > /tmp/temp2
mv -f /tmp/temp2 /tmp/temp1
done < 1.txt
cp /tmp/temp1 3.txt
while read var
do
echo "s/"$var"//g" >> sed.script2
done < 1.txt
sed --file=sed.script2 2.txt > 3.txt
rm -f sed.script