使用 awk、粘贴和管道组合 spiro 和队列的输出

Combing output of sprio and squeue using awk, paste, and piping

我想结合 sprio 和 squeue 的输出,这样我就可以在一行中看到 JobId、名称、优先级、年龄、状态和时间,而无需使用文件。我以为我可以使用 awk、粘贴和一些管道来做到这一点,但我不知道 bash 语法除了让输出连续打印之外做任何事情。

{ sprio -u manninm; squeue -u $USER; } | paste

我想让每个输出的某些列并排打印,但我只能让两个输出连续打印。如果有人可以指出一些资源或提供一些建议,谢谢。

JOBID PARTITION     USER   PRIORITY        AGE  FAIRSHARE    JOBSIZE  PARTITION                 TRES
         284926 standard   $USER     196140        117      95896        128     100000
JOBID PARTITION     NAME     USER  ACCOUNT ST       TIME  NODES NODELIST(REASON)
            284938  standard SM.fastq  manninm kretzler PD       0:00      1 (Priority)

编辑: 所以在阅读了一些 awk 教程之后,我实际上想要打印到屏幕上的是 squeue 命令的字段 1-9,以及 sprio 命令的字段 1 和 4。

{ squeue -u manninm; sprior -u $USER; } |

创建两条记录,我希望记录 1 的字段 1:9 和记录二的字段 1 和 4 按列打印到屏幕上。好像并没有想象中那么简单

使用我上面评论中链接的 "matrix transpose" 想法,但将其简化为 "two rows at a time",这似乎是您想要的,试试这个 awk 单行而不是粘贴:

bash { sprio -u manninm; squeue -u $USER; } | awk 'NR%2 {split([=10=],a)} !(NR%2) {for(i=1;i<=NF;++i) print a[i],$i}'

squeue命令可以让你优先。它接受一个 --output 参数,您可以使用该参数选择希望 squeue 通过 printf 样式格式字符串显示的列。默认为

squeue --output "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R"

因此,如果您添加 %p%Q,您将在输出中获得一个包含作业优先级的附加列。

squeue --output "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R %p"

squeue --output "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %R %Q"

%p%Q的区别在于前者以浮点数形式给出优先级,而后者以整数形式给出。

请注意,squeue 也接受 --Format(大写 'F'),它采用列名列表而不是格式字符串。

不过,您不会获得优先级因素的详细信息。如果你想要那样,你确实需要合并 squeuesprio 的输出。请务必对输出进行排序并确保 squeue 仅列出待处理作业,否则您无法确定正确的行与 awk.

合并在一起

在这种情况下,最好的选择是使用 merge 命令,该命令将根据 jobid 协调两个命令的输出:

join <(squeue -t PD | sort -n) <(sprio | sort -n) | column -t