shell - 根据打开字符串中的输入值对文件进行排序

标签 shell unix awk sed grep

我有一个以下格式的文件,我需要读取以“>”开头的字符串,并根据 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

最佳答案

您可以尝试以下操作吗?

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中没有##,否则您可以将它们更改为任何其他字符串。基本上,我添加从 > 开始的行,直到下一次出现 > 之前的最后一行,我通过 ##< 将它们添加到单行 分隔符(您可以更改我已经提到过的它),然后使用第二个字段对它们进行排序,最后通过 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

关于shell - 根据打开字符串中的输入值对文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58019313/

相关文章:

unix - 将 find 的输出重定向到文件的问题

shell - id_rsa.pub 由 ssh-keygen -t rsa 创建时为空

bash - 只有 mkdir 如果它不存在

awk - 结合多个awk命令

awk - 使用 awk 交换由给定字符串分隔的两组单词)

awk - 如何使用 awk 打印存储在数组中的值的计数?

linux - 在Mac上执行bash和sh文件而不写扩展名

linux - 不使用 -S 选项对 ls -alh 的输出值进行排序

linux - 图像缩小脚本在 Linux 中创建更大尺寸的图像

bash - 来自非 bash shell 的 xclip 不持久