Linux bash脚本和awk对文件进行排序
所以我有一个大学项目,第一个练习我没能通过。我的问题是: 我有一个文件,我想选择其中的一些数据,然后在另一个文件中“显示”它。但是我要查找的数据在文件中有点分散,所以我需要在脚本中使用几个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
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/
-捕获整个非空行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
当我们看到
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~”的确切含义吗?@janedoer
变量包含以前捕获的行(r=$0
)@tripleee,关键时刻是长度…
行和查询…
行应该是相邻的谢谢你的回答!你能给我解释一下“r~”的确切含义吗?@janedoer
变量包含以前捕获的行(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