使用 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'),它采用列名列表而不是格式字符串。
不过,您不会获得优先级因素的详细信息。如果你想要那样,你确实需要合并 squeue
和 sprio
的输出。请务必对输出进行排序并确保 squeue
仅列出待处理作业,否则您无法确定正确的行与 awk
.
合并在一起
在这种情况下,最好的选择是使用 merge
命令,该命令将根据 jobid 协调两个命令的输出:
join <(squeue -t PD | sort -n) <(sprio | sort -n) | column -t
我想结合 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'),它采用列名列表而不是格式字符串。
不过,您不会获得优先级因素的详细信息。如果你想要那样,你确实需要合并 squeue
和 sprio
的输出。请务必对输出进行排序并确保 squeue
仅列出待处理作业,否则您无法确定正确的行与 awk
.
在这种情况下,最好的选择是使用 merge
命令,该命令将根据 jobid 协调两个命令的输出:
join <(squeue -t PD | sort -n) <(sprio | sort -n) | column -t