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