[unix] awk 한 번에 여러 변수에 할당

문자열에서 두 개의 숫자 값을 가져 와서 변수에 할당하려고합니다 awk( gawk특히 사용하고있는 것입니다). tmux 버전 문자열에서 메이저 버전 번호와 마이너 버전 번호를 awk변수 로 가져오고 싶습니다 .

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

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

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쉽게 발생할 수 있습니다 (I이 물건을 사용할 수 있도록 노력하겠습니다) 파일 정말 이 두 변수를 결합 할 수있는 방법이 있는지 궁금 해요, 그래서 config 파일에서 긴 줄 공간을 절약하기 위해 하나의 문장으로 할당 또는 입력과 공간 에서이 두 변수를 수집하는 다른 방법.

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

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

… 파이썬과 비슷하지만 특정 구문은에 존재하지 않습니다 awk. 가능한 다른 것이 있습니까?

가독성은 실제로 문제가 아니며 길이에 불과합니다.



답변

참고 gensubA는 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}'


답변

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


답변

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

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

다음 사용하는 ver[1]대신 maj, ver[2]대신 min.

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


답변

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

split()함수를 사용하여 버전 문자열을 배열로 분할 ver한 다음 ver[1]and ver[2]가 아닌 majmin에 각각 액세스합니다 (또는 단순히 해당 변수에 값을 저장).

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

여기에 플러스 split()gawk확장 이 아닙니다 (선택적 인 네 번째 인수 seps는 있지만 ).


답변