awk 한 번에 여러 변수에 할당


9

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

  • 입력 : tmux 2.8; maj == 2과min == 8
  • 입력 : tmux 1.9a; maj == 1과min == 9
  • 입력 : tmux 2.10; maj == 2과min == 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. 가능한 다른 것이 있습니까?

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

답변:


9

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

호환성에 대한 추가 설명에 감사드립니다!
— villapx 2014 년


5

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

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

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

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


3

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

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

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

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


+1이지만 왜 문자열 함수 /[.a-z]/의 세 번째 (필드 분리) 인수로 split사용 "."합니까?
— Cbhihe

2
@ Cbhihe 내 대답에 대한 설명을 참조하십시오 (villapx가 유용하다고 생각한 이후로 삭제되지 않았습니다. villapx 덕분입니다!).
— Stephen Kitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.