Awk
按從特定列中提取的數字對 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
我想根據隊列列中的數字對輸出進行排序,所以第一行應該是 with
q@bam01
等等。我不明白如何使用 grep/awk
要按第 8 列(“隊列”列)排序,僅考慮數字部分,並假設前導文本始終為“
comp.q@bam
”(10 個字元),並且該欄位之前只有一個空格,並按數字排序,您可以用:qstat | head -n 2 qstat | sed 1,2d | sort -k8.12,8.14n
兩個單獨的呼叫
qstat
是首先列印兩個標題行(以便它們不與數據一起排序),然後對實際數據進行排序(刪除前兩個標題行)。排序是在欄位 8 上“鍵入”(-k
),從位置 12 開始,到位置 14 結束,採用n
數字排序。此處的鍵定義將“隊列”欄位之前的前導空格計為位置 #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 到命令組的管道(用大括號括起來
{}
);該命令組將前兩行讀取到變數 header1 和 header2 中,然後列印這些標題行。由於這些行現在已從輸入中消失,因此後續sort
命令只剩下要排序的數據。我發現顯式讀取兩個標題行更明顯,但是您可以執行兩次簡單的“讀取和列印”,或者使用循環。