![按从特定列中提取的数字对 bash 输出进行排序](https://linux22.com/image/177419/%E6%8C%89%E4%BB%8E%E7%89%B9%E5%AE%9A%E5%88%97%E4%B8%AD%E6%8F%90%E5%8F%96%E7%9A%84%E6%95%B0%E5%AD%97%E5%AF%B9%20bash%20%E8%BE%93%E5%87%BA%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我是 bash 新手,正在努力完成以下任务:UGE 的输出如下所示:
mgenkin@bamdev2:~/projects/BrainFlowUtilities/BrainFlowSimulations$ qstat
job-ID prior name user state submit/start at queue
jclass slots ja-task-ID
-------------------------------------------------------------------------------------------
-----------------------------------------------------
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam11 16 1
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam17 16 2
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam13 16 3
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam05 16 4
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam08 16 5
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam15 16 6
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam21 16 7
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam27 16 8
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam12 16 9
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam22 16 10
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 1
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 2
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 3
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 4
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 5
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 6
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 7
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 8
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 9
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 10
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 11
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 12
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 13
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 14
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 15
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 16
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 17
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 18
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 19
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam23 1 20
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 21
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 22
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 23
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 24
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 25
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam23 1 26
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam26 1 27
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 28
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 29
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam03 1 30
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 31
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam28 1 32
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 33
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 34
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam23 1 35
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam26 1 36
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 37
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 38
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam03 1 39
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 40
我想根据队列列中的数字对输出进行排序,因此第一行应该是等等q@bam01
。
我不明白如何使用 grep/awk
答案1
要按第 8 列(“队列”列)排序,仅考虑数字部分,并假设前导文本始终为“ comp.q@bam
”(10 个字符),并且该字段之前只有一个空格,并按数字对它们进行排序,您可以可以用:
qstat | head -n 2
qstat | sed 1,2d | sort -k8.12,8.14n
两个单独的调用qstat
首先打印两个标题行(以便它们不与数据一起排序),然后对实际数据进行排序(删除前两个标题行)。该排序在字段 8 上“键入”( -k
),从位置 12 开始,到位置 14 结束,采用n
数字排序。此处的键定义将“队列”字段之前的前导空格计算为位置 #1,因此实际数字(在示例中)从位置 12 开始。如果您的输出可能有更长的数字字段,请8.14
向上调整结束范围 ( )。
如果您想将其保留为可重用的东西,您可以创建一个函数:
function sortqstat() {
qstat | head -n 2
qstat | sed 1,2d | sort -k8.12,8.14n
}
由于数字部分似乎是用零填充的,因此您可以尝试更简单的变体 - 只需告诉sort
对字段 8 进行一般排序即可:
qstat | sort -k8,8
这种简单的排序会移动标题;为了使它们分开,请像上面一样使用单独的调用。在这种简化中,重复的队列名称将一起排序,然后在其中按数字排序 - 如果存在不同的队列名称,则并非全部严格按数字排序。
格伦·杰克曼评论了一项改进——一种仅使用以下内容来解析输出的方法一拨电至qstat
;我稍微修改了他们的想法:
qstat | { IFS= read -r header1;
IFS= read -r header2;
printf "%s\n" "$header1" "$header2";
sort -k8,8; }
这将打开一个从 qstat 到命令组的管道(用大括号括起来{}
);该命令组将前两行读取到变量 header1 和 header2 中,然后打印这些标题行。由于这些行现在已从输入中消失,因此后续sort
命令只剩下需要排序的数据。我发现显式读取两个标题行更为明显,但您可以执行两次简单的“读取和打印”,或者使用循环。