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

时间:2017-12-11 05:43:02

标签: bash awk sed grep

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

A
D

list1a.txt包含:

>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"

f2.txt返回:

>A
AAAAA
>B
GGGGG
>C
CCCC
>
TTTT

正如预期的那样,它会返回&#34; D&#34;删除,但不是A,而不是它们下面的行。 我需要删除第一个列表中包含的任何行 第二个文件,以及它下面的行。

3 个答案:

答案 0 :(得分:2)

使用GNU sed

$ sed 's|.*|/^>&$/,+1d|' f1
/^>A$/,+1d
/^>D$/,+1d
$ sed -f <(sed 's|.*|/^>&$/,+1d|' f1) f2
>B
 GGGGG
>C
 CCCC
  • 为每一行创建命令,+n表示匹配行之后的n行
  • 然后使用这些命令对其他文件进行操作


如果GNU sed不可用,请尝试

$ sed -f <(sed 's|.*|/^>&$/{N;d;}|' f1) f2
>B
 GGGGG
>C
 CCCC
  • 此处N命令用于向模式空间添加下一行。然后删除它们。对于另外两行,请使用N;N三次使用N;N;N,依此类推


使用awkgetline

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

如果在f2

中只找到一个匹配项
awk 'NR==FNR{a[">"$0];next} ($0 in a) && (getline x)>0{delete a[$0];next} 1' f1 f2

答案 1 :(得分:1)

关注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

输出如下。

{{1}}

答案 2 :(得分:0)

TypeError unsupported operand type(s) for -: 'unicode' and 'unicode' 
TypeErrorTraceback (most recent call last)
<ipython-input-7-7a191c6f2678> in <module>()
----> 1 df['duration'] = df.event_time.apply(lambda x:x[1][1]-x[0][1])

/opt/conda/envs/python2/lib/python2.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2218         else:
   2219             values = self.asobject
-> 2220             mapped = lib.map_infer(values, f, convert=convert_dtype)
   2221 
   2222         if len(mapped) and isinstance(mapped[0], Series):

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:62658)()

<ipython-input-7-7a191c6f2678> in <lambda>(x)
----> 1 df['duration'] = df.event_time.apply(lambda x:x[1][1]-x[0][1])

TypeError: unsupported operand type(s) for -: 'unicode' and 'unicode'

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