我想从另一个列表中删除一个列表中包含的所有内容以及下一行。例如: 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,而不是它们下面的行。 我需要删除第一个列表中包含的任何行 第二个文件,以及它下面的行。
答案 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
,依此类推
使用awk
和getline
$ 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