awk 한 번에 여러 변수에 할당


9

문자열에서 두 개의 숫자 값을 가져 와서 변수에 할당하려고합니다 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. 가능한 다른 것이 있습니까?

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

답변:


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]가 아닌 majmin에 각각 액세스합니다 (또는 단순히 해당 변수에 값을 저장).

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.