Awk

按從特定列中提取的數字對 bash 輸出進行排序

  • July 24, 2020

我是 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

我想根據隊列列中的數字對輸出進行排序,所以第一行應該是 withq@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命令只剩下要排序的數據。我發現顯式讀取兩個標題行更明顯,但是您可以執行兩次簡單的“讀取和列印”,或者使用循環。

引用自:https://unix.stackexchange.com/questions/600058