2014-09-25 63 views
0

你好我尝试到一个文本文件,从这个转换:查找字符串,更换5套由制表与第三个字符串分隔的字符串

>ENSGENST0234567 ENSP0345678 scaffold999:1234-2345 1 
ENOASDOIJSADJASPDOKPOKASD 
ASDOJOIASJDOIJAKDJLKASDJL 
ASLDKJLKASJDLKASJDLKJASLK 

>ENSG0234567 ENST0345678 ENSP0456789 scaffold9999:2345-3456 -1 
POIWQELKJLKJASMDNKLSJDLKA 
ASPDOILKNSDMNASDLKJSADOIM 
POAKSDAMNSADOIHOADPOKSDLK 

要这样:

>ENSP0345678 
ENOASDOIJSADJASPDOKPOKASD 
ASDOJOIASJDOIJAKDJLKASDJL 
ASLDKJLKASJDLKASJDLKJASLK 

>ENSP0456789 
POIWQELKJLKJASMDNKLSJDLKA 
ASPDOILKNSDMNASDLKJSADOIM 
POAKSDAMNSADOIHOADPOKSDLK 

我的水平的awk/sed不在我可以在合理的时间内为这个问题提出解决方案的水平。任何人都有建议?

回答

1

所有这些都将做你想要什么:

awk -F"\t" '/>/{printf ">%s\n",$3; next}1;' file.fa 

perl -F"\t" -lane '/>/ ? print ">$F[2]" : print' file.fa 

或者,假设你只想要肽名(ENSP.*):

perl -pe 's/>.*(ENSP.+?)\s.*$/>\1/' file.fa 
3
awk -F'\t' 'NF > 1{$0=">"$3}1' file 

输出

>ENSP0345678 
ENOASDOIJSADJASPDOKPOKASD 
ASDOJOIASJDOIJAKDJLKASDJL 
ASLDKJLKASJDLKASJDLKJASLK 

>ENSP0456789 
POIWQELKJLKJASMDNKLSJDLKA 
ASPDOILKNSDMNASDLKJSADOIM 
POAKSDAMNSADOIHOADPOKSDLK 
+0

“固定”每个块中第一行的前导'>'char问题。 – shellter 2014-09-25 20:50:17

+0

文件前的最后1'是什么? @shellter – josifoski 2014-09-25 21:05:28

+0

你可以用'awk'1'文件'写一个最低限度正确的程序,它会打印文件中的所有记录。所以它只是简单地说“打印当前记录”。任何作为条件一部分评估的非零值意味着“真”,而“真”意味着打印此记录。该脚本可以写成长手'awk'-F \ t''NF> 1 {$ 0 =“>”$ 3}; {print $ 0}'文件'。 – shellter 2014-09-25 21:14:18