我有一个具有以下格式的文件,我需要读取以‘’>开头的字符串,并根据OS=按字母顺序对行进行排序。
>Mdm2 OS=Macaca nemestrina OX=9545 GN=MDM2 PE=3 SV=1
MVRSRQMCNTNMSVPTDGAVTTSQIPASEQETLVRPKPLLLKLLKSVGAQKDTYTMKEVL
FYLGQYIMTKRLYDEKQQHIVYCSNDLLGDLFGVPSFSVKEHRKIYTMIYRNLVVVNQQE
>Mdm2 OS=Homo sapiens OX=9545 GN=MDM2 PE=3 SV=1
SSDSGTSVSENRCHLEGGSDQKDLVQELQEEKPSSSHLVSRPSTSSRRRAISETEENSDE
>Mdm2 OS=Felis catus OX=9685 GN=MDM2 PE=4 SV=2
MSRGFRRAPLGQQGARIGRASAGSGPPGACAGPVWLERKWSKSPSLRGSPNPSDRSPAGF
AARSL
期望产出:
>Mdm2 OS=Felis catus OX=9685 GN=MDM2 PE=4 SV=2
MSRGFRRAPLGQQGARIGRASAGSGPPGACAGPVWLERKWSKSPSLRGSPNPSDRSPAGF
AARSL
>Mdm2 OS=Homo sapiens OX=9545 GN=MDM2 PE=3 SV=1
SSDSGTSVSENRCHLEGGSDQKDLVQELQEEKPSSSHLVSRPSTSSRRRAISETEENSDE
>Mdm2 OS=Macaca nemestrina OX=9545 GN=MDM2 PE=3 SV=1
MVRSRQMCNTNMSVPTDGAVTTSQIPASEQETLVRPKPLLLKLLKSVGAQKDTYTMKEVL
FYLGQYIMTKRLYDEKQQHIVYCSNDLLGDLFGVPSFSVKEHRKIYTMIYRNLVVVNQQE
到目前为止我的代码是:
while read p;
if [[ $p == >* ]];
then
#what should I do here to sort the line by OS ?
done <input.txt
发布于 2019-09-20 01:42:50
你能试一下吗。
awk '
/^>/{
if(val){
print val}
val=""
}
{
val=(val?val "##":"")$0
}
END{
if(val){
print val
}
}' Input_file | sort -k2.4 | tr -s '##' '\n'
解释:考虑到您的Input_file中没有##
,否则您可以将它们更改为任何其他字符串。基本上,我在添加从>
开始到最后一行的行,这些行是在下一次出现>
之前,通过##
分隔符将它们添加到一行中(您可以更改它,我已经提到了),然后用第二个字段对它们进行排序,最后再将##
by tr
命令移到新行。
输出如下(为提供的示例运行之后):
>Mdm2 OS=Felis catus OX=9685 GN=MDM2 PE=4 SV=2
MSRGFRRAPLGQQGARIGRASAGSGPPGACAGPVWLERKWSKSPSLRGSPNPSDRSPAGF
AARSL
>Mdm2 OS=Homo sapiens OX=9545 GN=MDM2 PE=3 SV=1
SSDSGTSVSENRCHLEGGSDQKDLVQELQEEKPSSSHLVSRPSTSSRRRAISETEENSDE
>Mdm2 OS=Macaca nemestrina OX=9545 GN=MDM2 PE=3 SV=1
MVRSRQMCNTNMSVPTDGAVTTSQIPASEQETLVRPKPLLLKLLKSVGAQKDTYTMKEVL
FYLGQYIMTKRLYDEKQQHIVYCSNDLLGDLFGVPSFSVKEHRKIYTMIYRNLVVVNQQE
https://stackoverflow.com/questions/58019313
复制相似问题