使用awk,粘贴和管道对sprio和squeue的输出进行组合

时间:2019-09-04 16:06:24

标签: bash paste slurm

我想结合sprio和squeue的输出,这样一来我就可以在不使用文件的情况下看到JobId,名称,优先级,年龄,状态和时间。我以为我可以使用awk,paste和一些管道来做到这一点,但是我不知道有什么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和记录2的字段1和4逐列打印到屏幕上。似乎没有我希望的那么容易。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

使用上面我的评论中链接的“矩阵转置”概念,但将其简化为“一次要两行”,这似乎是您要拍摄的,请尝试使用这种awk单线粘贴:

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