특정 열에서 추출된 숫자로 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

두 번의 별도 호출은 qstat먼저 두 개의 헤더 행을 인쇄한 다음(데이터와 함께 정렬되지 않도록) 실제 데이터를 정렬합니다(처음 두 헤더 행 제거). 정렬은 필드 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
}

숫자 부분이 0으로 채워져 있는 것처럼 보이므로 더 간단한 변형을 시도할 수 있습니다. 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명령에는 정렬해야 하는 데이터만 남습니다. 두 헤더 행을 모두 명시적으로 읽는 것이 더 분명하다고 생각하지만 간단한 "읽기 및 인쇄"를 두 번 수행하거나 루프를 사용할 수 있습니다.

관련 정보