模式匹配和删除对应于模式的四条线

时间:2014-02-05 16:00:51

标签: python sed awk

我有2个文件。文件1具有标识符(例如 DF:1:1 )。然后“1:N”是一个附加字段。第2行,第3行和第4行特定于标识符。文件2由一列标识符组成。 逻辑:如果文件2的标识符与文件1的标识符完全匹配,则删除与该标识符对应的所有4行。

文件1:

@DF:1:1  1:N
IIIIIIIIIIIIIIA
+
CCCCCCCCCCCCCCC
@DF:1:2  1:N
TTTTTTTTTTTTTTT
+
AJJJJJJJJJJJJAA
@DF:1:3  1:N
TTTTTTTTTTCAACA
+
LLLLLLLLLLLLLLN
@DF:2:1  1:N
NNNNNNNNNNNNNGC
+
DHHHHHHHHHHHHHH
@DF:1:4  1:N
CCCCCCCCCCCCCCC
+
DFFFFFFFFFFFFFF

文件2:

DF:1:1
DF:1:3
DF:2:1
DF:9:9
DF:6:9

预期输出:

@DF:1:2  1:N
TTTTTTTTTTTTTTT
+
AJJJJJJJJJJJJAA
@DF:1:4  1:N
CCCCCCCCCCCCCCC
+
DFFFFFFFFFFFFFF

我是生物信息学和编程的新手,并会感谢您的帮助。 谢谢。

4 个答案:

答案 0 :(得分:2)

[以下是基于输入中没有 TAB 字符的假设。]

您可以使用pastegrep来获得所需的输出:

paste - - - - < file1 | grep -F -v -f file2 | tr '\t' '\n'

上面连接4行file1(使用制表符作为分隔符),然后删除file2中包含字符串的行。最后,制表符被替换为换行符。对于您的样本输入,这将产生:

@DF:1:2  1:N
TTTTTTTTTTTTTTT
+
AJJJJJJJJJJJJAA
@DF:1:4  1:N
CCCCCCCCCCCCCCC
+
DFFFFFFFFFFFFFF

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed 's|.*|/^@&\\s/,+3d|' file2 | sed -f - file1

从file2创建一个sed脚本以匹配file1中的键,并删除以下3行。

答案 2 :(得分:0)

这些行中有existing questions(搜索sed delete multiple lines)。

正如您所看到的,您的选择在BSD sed(包括Mac)和GNU sed(Unix风格)之间略有不同。这是一个在我的Mac上运行的笨重的BSD版本:

cat bio_file2 | while read line; do sed -E "/$line/ {
N
N
N
d
}" bio_file1 > biof_tmp; mv biof_tmp bio_file1; done

没有就地修改选项(在Unix上为sed -i),因此使用tmp文件,并且还必须阅读(N)下一行,这很笨拙进入模式空间而不是使用gsed更短的语法 - 可以删除3个额外的行,对于例如不那么好删除100个额外的行。请注意使用双引号以使用shell变量进行匹配。


这是我期望GNU sed对应物的样子:(未经测试)

cat bio_file2 | while read line; do sed -i "/$line/,+3 d" bio_file1; done

如果您在匹配后有删除100行的情况,一种方法是找到匹配的行号     grep -n target somefile | awk -F:&#39; {print $ 1}&#39;

然后专门删除这些行i,i+100。但在这种情况下,需要注意从最高行数开始。

答案 3 :(得分:0)

使用awk

awk 'NR==FNR{a[$1];next}!($1 in a)' file2 RS=@ ORS=@ file1