如何跳过输出的第一行?

zyy*_*zyy 10 wc

这是问题,我想计算我在 hpc 中的作业数量,但这不是现成的功能之一。所以我做了这个简单的脚本

squeue -u user_name | wc -l
Run Code Online (Sandbox Code Playgroud)

wheresqueue打印所有作业,如下所示

> squeue -u user_name
   JOBID PARTITION NAME     USER ST       TIME  NODES NODELIST(REASON)
 8840441    theory cteq      fxm PD       0:00      1 (Resources)
 8840442    theory cteq      fxm PD       0:00      1 (Priority)
 8840443    theory cteq      fxm PD       0:00      1 (Priority)
 8840444    theory cteq      fxm PD       0:00      1 (Priority)
Run Code Online (Sandbox Code Playgroud)

这将被输送到wc并计算行数。但是,第一行不是作业的条目。wc计数时如何指示跳过第一行?或者我应该只取wc减一的输出?

提前致谢!

Bex*_*Bex 44

您可以从剿标题行squeue-h-option。这将消除删除第一行的需要。

squeue手册页

-h, --noheader
    Do not print a header on the output.
Run Code Online (Sandbox Code Playgroud)

  • 或者给 `squeue` 添加一个选项,比如 `-n` 来直接输出计数。 (6认同)
  • @Scot 你应该回答这个问题。我会赞成。 (2认同)

use*_*469 30

有很多方法可以做到这一点,我首先想到的是:

squeue -u user_name | tail -n +2 | wc -l
Run Code Online (Sandbox Code Playgroud)

从手册页tail

-n, --lines=[+]NUM            output the last NUM lines, instead of the last 10;
                              or use -n +NUM to output starting with line NUM
Run Code Online (Sandbox Code Playgroud)

所以你 -n +2 应该跳过第一行。

你也可以使用tail的排序形式: tail +2

  • `tail` 出现在我的脑海中,但不记得看过或考虑过 +n 选项。对于想法+解释和参考:很好! (3认同)
  • 我更喜欢`sed 1d` bc 我很难记住头尾的计数方向 (3认同)
  • @Mr.Donutz `head` 有一个类似的 `+` 标志,它会留下一些行。我总是很难记住哪个做了什么。 (2认同)

mir*_*173 5

只是为了好玩。您可以从 wc 输出中减去 1

echo $(( $(squeue -u user_name|wc -l)-1 ))
Run Code Online (Sandbox Code Playgroud)

或者

squeue -u user_name|wc -l|awk '{print $0-1}'
Run Code Online (Sandbox Code Playgroud)

当您使用 awk 时,您可以使用 awk 计算行数,因此避免使用 wc

squeue -u user_name|awk 'END{print NR-1}'
Run Code Online (Sandbox Code Playgroud)

END 表示,在读取所有行后执行以下块,NR 表示到目前为止读取的行数。