awk는 한 번에 여러 변수에 할당합니다.

awk는 한 번에 여러 변수에 할당합니다.

문자열에서 두 개의 숫자 값을 가져와서 이를 사용하여 변수에 할당하려고 합니다 awk( gawk이것이 제가 구체적으로 사용하는 것입니다). tmux 버전 문자열의 주 버전 번호와 부 버전 번호를 변수로 추출하고 싶습니다 awk. 예를 들면 다음과 같습니다.

  • 입력 : tmux 2.8;maj == 2min == 8
  • 입력 : tmux 1.9a;maj == 1min == 9
  • 입력 : tmux 2.10;maj == 2min == 10

내 입력이 표준 입력에서 온다고 가정하면 tmux -V현재 다음이 있습니다.

tmux -V | awk '{
                  maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
                  min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
                  # ...do something with maj and min...
               }'

이것은 작동하지만 많은 tmux 사용자가 알고 있듯이 if-shell파일 .tmux.conf에서 (나는 이것을 사용하고 싶었습니다) 쉽게 결과를 초래할 수 있습니다.진짜구성 파일의 행이 꽤 길기 때문에 공간을 절약하기 위해 이 두 변수 할당을 하나의 명령문으로 결합하는 방법이 있는지 궁금합니다. 또는 입력에서 이 두 변수를 수집하고 공간을 절약하는 다른 방법이 있는지 궁금합니다.

나는 다음과 같은 것을 생각하고 있습니다 :

awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'

...파이썬과 비슷하지만 특정 구문을 사용하면 awk다른 것이 가능합니까?

가독성은 실제로 문제가 아니라 길이일 뿐입니다.

답변1

GNU awk를 사용하고 있으므로 3-arg 형식을 사용하여 match()여러 캡처 그룹을 저장할 수 있습니다.

awk '
    match($0, /([0-9]+)\.([0-9]+)/, m) {maj=m[1]; min=m[2]; print maj, min}
' <<END
tmux 2.8
tmux 1.9a
tmux 2.10
END
2 8
1 9
2 10

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

답변2

이는 gensub확장 gawk이므로 다른 awk구현과 함께 사용할 수 없습니다. 또한 단항 연산자는 모든 구현에서 숫자 변환을 강제 +하지 않으며 사용하기가 더 쉽습니다.awk+ 0

여기에서 다음을 수행할 수 있습니다.

tmux -V | awk -F '[ .]' '{maj = $2+0; min = $3+0; print maj, min}'

GNU 확장을 사용해도 괜찮다면 awk다음과 같이 할 수도 있습니다.

tmux -V | awk -v FPAT='[0-9]+' '{maj = $1; min = $2; print maj, min}'

답변3

버전을 배열로 분할할 수 있습니다.

awk '{ split($2, ver, /[.a-z]/) }'

ver[1]그런 다음 대신 을 사용 maj하십시오 .ver[2]min

구분 기호를 추가하면 a-z버전 번호에서 모든 소문자가 제거됩니다. (여기에서는 숫자를 명시적으로 추출하기 때문에 다른 솔루션이 더 좋습니다.)

답변4

다른 사용자가 이 답변을 게시했으나 나중에 삭제되었습니다. 나는 이것이 유용하다고 생각합니다:

split()함수를 사용하여 버전 문자열을 배열로 분할 하고 합계 대신 ver별도로 합계에 액세스합니다 ( 또는 단순히 이러한 변수에 값을 저장합니다).ver[1]ver[2]majmin

tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'

여기서 장점은 확장이 split()아니라는 점입니다(선택적인 네 번째 인수 는 확장임에도 불구하고).gawkseps

관련 정보