出力の最初の行をスキップする方法は? [コピー]

出力の最初の行をスキップする方法は? [コピー]

問題は、HPCのジョブ数を計算したいのですが、これが基本機能の1つではないことです。だから私はこのように単純なスクリプトを作成しました。

squeue -u user_name | wc -l

squeue以下のようにすべてのジョブを印刷します。

> 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)

パイプで接続してwc行数を計算します。ただし、最初の行はジョブのエントリではありません。wc計算時に最初の行をスキップするように指示するにはどうすればよいですか?それとも、wc合計の出力を1ずつ減らす必要がありますか?

よろしくお願いします!

答え1

squeue- オプションを使用すると、ヘッダー行を表示しないことがあります-h。これにより、最初の行を削除する必要がなくなります。

~からSquue のマニュアルページ:

-h, --noheader
    Do not print a header on the output.

答え2

これを行う方法はいくつかありますが、最初に思い付く方法は次のとおりです。

squeue -u user_name | tail -n +2 | wc -l

マニュアルページからtail

-n, --lines=[+]NUM            output the last NUM lines, instead of the last 10;
                              or use -n +NUM to output starting with line NUM

したがって、-n +2は最初の行をスキップする必要があります。

テールのソート形式を使用することもできます。tail +2

答え3

楽しみに。 wc出力から1を引くことができます。

echo $(( $(squeue -u user_name|wc -l)-1 ))

または

squeue -u user_name|wc -l|awk '{print $0-1}'

awkを使用する場合は、awkを使用して行数を計算し、wcを避けることができます。

squeue -u user_name|awk 'END{print NR-1}'

END はすべての行を読み込んだ後に次のブロックを実行することを意味し、NR はこれまでに読み込んだ行数を意味します。

答え4

実際、同じ結果を得る方法はいくつかあります。別の方法は、次のようにシーケンスコマンドの出力をsedにパイプすることです。

squeue -u user_name | sed '1d' | wc -l

関連情報