2014-02-05 140 views
0

我有2个文件。文件1具有标识符(例如,DF:1:1)。然后“1:N”是一个附加字段。第二,第三和第四行是特定于标识符的。文件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 

我在Bioi是新信息学和编程,并会欣赏你的帮助。 谢谢。

+0

我的初始脉冲。将读存储器中的满'File2'以阵列(或一个字典)然后打开并读出由'线File1'线,检查对阵列并打印(或不打印)后续行。 –

+0

你是否可以在Code的帮助下解释我,因为我是编程新手。谢谢 – user3275818

回答

2

[以下是基于您不必在输入TAB字符的假设。]

你可以利用pastegrep,以获得所需的输出:

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

上面加入4行file1(以tab作为分隔符),然后删除包含file2中的字符串的行。最后,制表符被替换为换行符。为您的样品输入,这会产生:

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

有沿着这些线路(搜索sed delete multiple linesexisting questions。你可以看到,你的选项在BSD sed(包括Mac)和GNU sed(Unix风格)之间有微妙的差别。这里有一个笨重的BSD版本,在我的Mac工作:

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

这是在没有就地修改选项(sed -i在Unix),从而使用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:'{print $ 1}'

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

2

这可能为你工作(GNU SED):

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

请从文件2 sed脚本来匹配在文件1键和删除以下3行。

+0

好主意,我从这个sed命令中学习,但是如果输入file1并不总是固定3行,那么它会失败。 – BMW

+0

@BMW这个解决方案是根据契约'模式匹配和删除与模式相对应的四条线' – potong