我有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
我是生物信息学和编程的新手,并会感谢您的帮助。 谢谢。
答案 0 :(得分:2)
[以下是基于输入中没有 TAB 字符的假设。]
您可以使用paste
和grep
来获得所需的输出:
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