awk 인라인 매개변수 조작

awk 인라인 매개변수 조작

bjobs -w작업 컴퓨터에서 실행하면 다음 출력이 표시됩니다.

JOBID   USER  STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME SUBMIT_TIME
821213  user1 RUN   parallel16 hpc2        16*pirineus NAME1111 Apr 9 20:26
823954  user1 RUN   parallel16 hpc1        5*pirineus4 NAME2222 Apr 11 22:45
824083  user1 RUN   parallel16 hpc1        16*collserola2 otherthing Apr 12 19:20
824297  user1 RUN   parallel16 hpc1        8*collserola10 another_long_name Apr 13 20:50
824305  user1 RUN   parallel16 hpc2        16*collserola5 Try_anothername Apr 14 12:16

그런 다음 첫 번째와 여섯 번째 열의 정보를 얻고 싶습니다. 이를 위해 나는 다음과 같은 일을 할 수 있다고 생각했습니다.

bjobs |awk '(NR>=2) {print $1 " "$6 }'

그런데 나는

821213 16*pirineus
823954 5*pirineus
824083 16*collsero
824297 8*collsero
824305 16*collsero

내가 얻고 싶을 때

821213 pirineus
823954 pirineus4
824083 collsero2
824297 collsero10
824305 collsero5

(매개변수 연산을 사용한다는 생각에 따라) 다음 명령을 시도했지만 오류가 발생했습니다.

bjobs |awk '(NR>=2) {print $1" " ${6#* *} }'

awk: (NR>=2) {print $1" " ${6#* *} }
awk:                       ^ syntax error
awk: línea ord.:1: (NR>=2) {print $1" " ${6#* *} }
awk: línea ord.:1:                         ^ syntax error

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변1

awk프로그램 내에서는 쉘 매개변수 대체를 사용할 수 없습니다 .

여섯 번째 열의 첫 번째 위치를 제거하려면 다음을 사용하십시오 sub().

bjobs -w | awk 'NR > 1 { sub("^[^*]*[*]", "", $6); print $1, $6 }'

*인쇄하기 전에 여섯 번째 필드까지의 비트를 제거하여 여섯 번째 필드를 수정합니다. 정규식은 문자열의 시작 부분에 없는 임의 ^[^*]*[*]의 문자 수와 일치 한 다음 빈 문자열로 바꿉니다.**

위의 질문의 출력은 다음과 같이 변환됩니다.

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5

노트:아래의 모든 변형(솔루션 포함)은 여섯 번째 필드에 sed이 있다고 가정합니다.*. 그렇지 않더라도 위의 내용은 작동합니다.

또 다른 방법은 여섯 번째 필드를 분할 *하고 두 번째 부분을 인쇄하는 것입니다.

bjobs -w | awk 'NR > 1 { split($6, a, "[*]"); print $1, a[2] }'

세 번째 방법은 공백과 *필드 구분 기호를 사용하는 것입니다(필드 번호 지정 변경 사항 참고).

bjobs -w | awk -F "[[:blank:]*]+" 'NR > 1 { print $1, $7 }'

사용 sed:

bjobs -w | sed -nE 's/^([[:alnum:]]+).*\*([[:alnum:]]+).*/\1 \2/p'

답변2

원하는 출력을 얻기 위해 다음 명령을 사용했습니다.

awk 'NR >=2{print $1,$6}' example.txt  | sed "s/[0-9]\{1,2\}\*//g"

산출

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5

관련 정보