特定の列から抽出された数値でbash出力を並べ替える

特定の列から抽出された数値でbash出力を並べ替える

私は初めて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回実行するか、ループを使用できます。

関連情報