Linux bash脚本和awk对文件进行排序

Linux bash脚本和awk对文件进行排序,linux,bash,shell,awk,Linux,Bash,Shell,Awk,所以我有一个大学项目,第一个练习我没能通过。我的问题是: 我有一个文件,我想选择其中的一些数据,然后在另一个文件中“显示”它。但是我要查找的数据在文件中有点分散,所以我需要在脚本中使用几个awk命令来获取它们 Query= fig|1240086.14.peg.1 Length=76 Score E Sequences producing signific

所以我有一个大学项目,第一个练习我没能通过。我的问题是: 我有一个文件,我想选择其中的一些数据,然后在另一个文件中“显示”它。但是我要查找的数据在文件中有点分散,所以我需要在脚本中使用几个awk命令来获取它们

Query= fig|1240086.14.peg.1

Length=76
                                                                  Score     E
Sequences producing significant alignments:                          (Bits)  Value

 fig|198628.19.peg.2053                                              140     3e-42


> fig|198628.19.peg.2053
Length=553
在图中,您可以看到有两种类型的“Length=”,我只想“捕获”一个“Query=”后面的“Length=”。 我必须使用awk,所以我尝试了以下方法:

 awk '{if(/^$/ && $(NR+1)/^Length=/) {split($(NR+1), b, "="); print b[2]}}'

但它不起作用。。。有人有想法吗?

awk
解决方案:

awk '/^Length=/ && r~/^Query/{ sub(/^[^=]+=/,""); printf "%s ",$0 }
     NF{ r=$0 }END{ print "" }' file

  • NF{r=$0}
    -捕获整个非空行
  • /^Length=/&&r~/^Query/
    -遇到前一行以
    Query
    开头的
    Length
    行时(由
    r~/^Query/
    确保)

    • awk
      解决方案:

      awk '/^Length=/ && r~/^Query/{ sub(/^[^=]+=/,""); printf "%s ",$0 }
           NF{ r=$0 }END{ print "" }' file
      

      • NF{r=$0}
        -捕获整个非空行
      • /^Length=/&&r~/^Query/
        -遇到前一行以
        Query
        开头的
        Length
        行时(由
        r~/^Query/
        确保)

      您需要了解Awk是如何工作的。它读取一行,评估脚本,然后重新开始,一次读取一行。因此,没有办法说“下一行包含这个”。你可以做的是“如果这行包含,那么记住它直到…”


      当我们看到
      Query=
      时,这会将标志
      q
      设置为1(true),然后跳到下一行。如果我们看到
      Length
      和最近看到的
      Query=
      ,那么
      q
      将是1,因此我们打印。在其他情况下,在任何非空行上将
      q
      设置回“最近未看到”。(我将其设置为非空状态,以便在不影响整体逻辑的情况下允许任何地方出现空行。)

      您需要了解Awk是如何工作的。它读取一行,评估脚本,然后重新开始,一次读取一行。因此,没有办法说“下一行包含这个”。你可以做的是“如果这行包含,那么记住它直到…”


      当我们看到
      Query=
      时,这会将标志
      q
      设置为1(true),然后跳到下一行。如果我们看到
      Length
      和最近看到的
      Query=
      ,那么
      q
      将是1,因此我们打印。在其他情况下,在任何非空行上将
      q
      设置回“最近未看到”。(我将其设置为非空状态,以便在不影响整体逻辑的情况下允许在任何地方出现空行。)

      听起来这正是您对问题第一部分的要求:

      $ awk -F'=' '!NF{next} f && ($1=="Length"){print $2} {f=($1=="Query")}' file
      76
      

      但是idk第二部分是关于什么的,因为在您的输入中没有“数据”行,而且我能说的最多的是示例输入中只有一个有效的输出。

      听起来这就是您想要回答问题的第一部分:

      $ awk -F'=' '!NF{next} f && ($1=="Length"){print $2} {f=($1=="Query")}' file
      76
      


      但是idk第二部分是关于什么的,因为在你的输入中没有“数据”行,我能告诉你的是样本输入中只有一个有效的输出。

      它必须是awk吗,你可以使用任何东西吗?当然最好使用awk,但是我愿意接受任何东西哈哈,你的问题是,在给定输入的情况下包含预期的输出。请参阅,特别是关于提供排序的部分。您可以做的最好的事情是使用
      awk(1)
      进行排序,并使用
      sort(1)
      进行计算。一旦你不知道怎么做这些事情,就去stackoverflow。尝试用
      ls(1)
      计算
      pi
      数字,这是一个真正的挑战!!!阅读
      grep(1)
      ,因为它将一次性解决所有问题。名称是不幸的,但它是你需要的工具。它必须是awk吗,你可以使用任何东西吗?嗯,最好使用awk,但我愿意接受任何东西。哈哈,你的问题是,在给定输入的情况下,包含预期的输出。请参阅,特别是关于提供排序的部分。您可以做的最好的事情是使用
      awk(1)
      进行排序,并使用
      sort(1)
      进行计算。一旦你不知道怎么做这些事情,就去stackoverflow。尝试用
      ls(1)
      计算
      pi
      数字,这是一个真正的挑战!!!阅读
      grep(1)
      ,因为它将一次性解决所有问题。名字很不幸,但它是你需要的工具。@tripleee,关键时刻是
      长度…
      行和
      查询…
      行应该是相邻的谢谢你的回答!你能给我解释一下“r~”的确切含义吗?@janedoe
      r
      变量包含以前捕获的行(
      r=$0
      )@tripleee,关键时刻是
      长度…
      行和
      查询…
      行应该是相邻的谢谢你的回答!你能给我解释一下“r~”的确切含义吗?@janedoe
      r
      变量包含以前捕获的行(
      r=$0
      ),谢谢!!你能解释一下“!NF{next}f”是什么意思吗?关于第二部分,data1是查询,data2是长度,我用两个单独的awk命令提取它们,当我把它们放在一个文件中时,它会在data1的末尾“附加”data2,但我希望data2是前面请求的data1a旁边的一个选项卡,请编辑您的问题,以包括您试图在示例输入/输出中描述wrt这些“数据”项的内容,或者删除此问题中的所有提及内容并提出新问题。谢谢!!你能解释一下“!NF{next}f”是什么意思吗?关于第二部分,data1是查询,data2是长度,我用两个单独的awk命令提取它们,当我把它们放在一个文件中时,它会在data1的末尾“附加”data2,但我希望data2是前面请求的data1a旁边的一个选项卡,请编辑您的问题,以包括您试图在示例输入/输出中描述wrt这些“数据”项的内容,或删除此问题中的所有提及内容并提出新问题。谢谢!!!非常好的主意,这将帮助我在整个项目中,谢谢你的e