AWK : $ (cat)이 stdin에서 작동하지만 $ *가 작동하지 않는 이유는 무엇입니까?


9
echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $(cat) }"

위의 구문은 계산 결과 '1337'과 함께 잘 작동합니다.

echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"

그러나 오류가 없지만 위의 구문은 작동하지 않습니다.

Plz는 조언합니다.

답변:


13

$(command)구문의 출력을 리턴한다 command. 여기서는 cat표준 입력 (stdin)에서 표준 출력 (stdout)으로 모든 것을 복사 하는 매우 간단한 프로그램을 사용하고 있습니다. 당신이 실행되기 때문에 awk큰 따옴표 안에 스크립트는이 $(cat)쉘에 의해 확장 하기 전에awk 스크립트가 실행는 읽을 수 있도록, echo표준 입력과 표준 출력으로 정식 사본이로 출력합니다. 그런 다음 awk스크립트 로 전달됩니다 . 당신은 이것을 사용하여 실제로 볼 수 있습니다 set -x:

$ set -x
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $(cat) }"
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
++ cat
+ awk 'BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
1337

그래서, awk실행 실제로 BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'1337을 반환합니다.

이제는 $*쉘 스크립트에 지정된 모든 위치 매개 변수로 확장되는 특수 쉘 변수입니다 (참조 man bash).

   *      Expands to the positional parameters, starting from one.  When the expan
          sion  is not within double quotes, each positional parameter expands to a
          separate word.  In contexts where it is performed, those words  are  sub
          ject  to  further word splitting and pathname expansion.  When the expan
          sion occurs within double quotes, it expands to a single  word  with  the
          value  of each parameter separated by the first character of the IFS spe
          cial variable.  That is, "$*" is equivalent to "$1c$2c...",  where  c  is
          the  first  character of the value of the IFS variable.  If IFS is unset,
          the parameters are separated by spaces.  If IFS is null,  the  parameters
          are joined without intervening separators.

그러나이 변수는 비어 있습니다. 따라서 awk스크립트는 다음과 같습니다.

$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print  }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'

$*빈 문자열로 확장하고, awk빈 문자열을 인쇄했다, 그리고 더 출력을 얻을 수없는 이유입니다.


bc대신 대신 사용하고 싶을 수도 있습니다 .

$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11

아마도을 사용해야합니다 bc -l. 그렇지 않으면 위에 게시 한 불일치가 나타납니다 (나눗셈 결과가 잘린 곳).
cmbuckley

@ cmbuckley 나는 함께 놀아서 1337을 인쇄하려고 시도했지만 scale=(OP는 leetspeak와 놀고 싶다고 생각합니다) 길을 찾을 수 없었습니다. 내 시스템으로 bc -l돌아갑니다 1336.99888888888888888888.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.