私は初めてbashに触れ、次の問題で苦労しています。 UGEの出力は次のとおりです。
mgenkin@bamdev2:~/projects/BrainFlowUtilities/BrainFlowSimulations$ qstat
job-ID prior name user state submit/start at queue
jclass slots ja-task-ID
-------------------------------------------------------------------------------------------
-----------------------------------------------------
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam11 16 1
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam17 16 2
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam13 16 3
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam05 16 4
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam08 16 5
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam15 16 6
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam21 16 7
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam27 16 8
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam12 16 9
5247 0.51599 Genkin_Fit mgenkin r 07/21/2020 16:40:21 comp.q@bam22 16 10
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 1
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 2
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 3
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 4
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 5
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 6
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam22 1 7
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 8
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 9
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 10
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 11
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 12
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 13
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 14
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 15
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 16
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 17
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 18
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 19
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam23 1 20
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 21
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 22
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 23
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 24
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 25
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam23 1 26
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam26 1 27
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 28
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 29
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam03 1 30
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 31
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam28 1 32
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam20 1 33
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam27 1 34
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam23 1 35
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam26 1 36
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam17 1 37
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam15 1 38
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam03 1 39
30995 0.50020 Genkin_Fit mgenkin r 07/23/2020 13:12:08 comp.q@bam01 1 40
キュー列の数に基づいて出力をソートしたいので、最初の行は次q@bam01
のようになります。
grep/awkの使い方がわからない
答え1
comp.q@bam
数値部分のみを考慮し、前のテキストが常に ""(10文字)でフィールドの前に空白のみがあるとし、列8(「キュー」列)に基づいて並べ替え、数字で並べ替えるには、次のようにします。
qstat | head -n 2
qstat | sed 1,2d | sort -k8.12,8.14n
2つの別々の呼び出しは、qstat
最初に2つのヘッダー行を印刷してから(データと並べ替えられないように)、実際のデータを並べ替えます(最初の2つのヘッダー行を削除します)。ソートは、フィールド8の数字順-k
に12番目の位置で始まり、14番目の位置で終わる「キー指定」()です。n
ここで、キー定義はQueueフィールドの前の先頭のスペースを位置#1として計算するため、実際の数字(例では)は位置12で始まります。出力に長い数値フィールドが含まれる可能性がある場合は、8.14
終了範囲()を上に調整します。
再利用可能なままにするには、次の関数を作成できます。
function sortqstat() {
qstat | head -n 2
qstat | sed 1,2d | sort -k8.12,8.14n
}
数値部分がゼロで埋められているように見えるので、より単純な変形を試すことができます。sort
フィールド8に通常ソートするように指示するだけです。
qstat | sort -k8,8
この単純なソートはヘッダーを移動します。ヘッダーを別々に保持するには、上記のように別々の呼び出しを使用します。この単純化では、重複したキュー名が一緒に並べ替えられ、そこで数字でソートされます。キュー名が異なる場合、すべてのキューが厳密に数字でソートされるわけではありません。
グレンジャックマン改善点について言及しました。ちょうど以下を使用して出力を解析する方法です。一つ;に電話してqstat
アイデアを少し修正しました。
qstat | { IFS= read -r header1;
IFS= read -r header2;
printf "%s\n" "$header1" "$header2";
sort -k8,8; }
これにより、qstatからコマンドグループへのパイプ(中括弧で囲まれた{}
)が開きます。コマンドグループは、最初の 2 行を変数 header1 と header2 として読み込み、ヘッダ行を出力します。これらの行は入力から消えたので、後続のsort
コマンドにはソートする必要があるデータのみが残ります。両方のヘッダー行を明示的に読み取ることはより明白であると思いますが、単純な「読み取りと印刷」を2回実行するか、ループを使用できます。