awk의 첫 번째 문에 필요한 변수가 있나요?

awk의 첫 번째 문에 필요한 변수가 있나요?

오늘 awk에 어려움을 겪고 있습니다. 내가 이것을 시도하면 :

df|awk '{print $2; $some=$2; print $some}'

예상대로 작동하고 디스크 크기가 두 배로 표시되지만 그렇게 하면 다음과 같습니다.

df|awk '{$some=$2; print $some}'

빈 줄만 나타납니다. 왜 이런 일이 발생합니까? 제가 이해한 내용에 문제가 있을 수 있지만 왜 후속 필드가 작동하려면 한 필드를 사용해야 합니까? 나는 또한 이것을 시도했다:

df|awk '{print "hello"; $some=$2; print $some}'

나는 각각 줄 바꿈으로 구분된 여러 개의 "hello"를 얻습니다. $some=$2가 어디에 없나요?

df명령 출력:

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       38448788 32098732   4396932  88% /
udev             1914564        4   1914560   1% /dev
tmpfs             768744      984    767760   1% /run

답변1

$앞에 - 기호를 사용 하면 안 됩니다 some. 첫 번째 명령이 $2인쇄된 다음 이후 $some=$2로 변환되어 (일부 구현 에서는 모두가 아닌 로 변환되고 오류 메시지가 표시됨), Record()를 for로 바꾼 다음 인쇄합니다. 이는 다음과 같다는 것을 의미합니다.$0=$2someawksome""0$0$2$some$0

df|awk '{print $2; $0=$2; print $0}'

그리고

df|awk '{$0=$2; print $0}'

당신이 하고 싶은 일은 다음과 같습니다:

df|awk '{print $2; some=$2; print some}'

답변2

예상했던 결과를 얻었습니다. 첫 번째 명령은 각 항목을 두 번 인쇄합니다. 두 번째 명령은 이를 한 번 인쇄합니다.

이는 다소 색다른 방식입니다. "some"은 정의되지 않았기 때문에 기본값은 0입니다. 따라서 $some은 $0이며 이는 전체 줄을 나타냅니다. 따라서 기본적으로 $2를 사용할 때 해당 줄을 $2에 있는 내용으로 바꿉니다.$some=$2

이 결과와 비교해보세요:

johan@computer:~$ df|awk '{$some=$2; print}'
1K-blocks
30827524
4041028
1621692
5120
4054228
102400
4054228
60555340
209548784

출력이나 다른 결과가 나오지 않는 이유: 적어도 일부 시스템에서는 초기화되지 않은 변수를 사용하는 동작이 정의되지 않을 수 있다고 예상합니다.

Solaris에서는 /usr/xpg4/bin/awk에 설치된 POSIX 호환 버전뿐 아니라 "표준" awk에도 액세스할 수 있습니다. 이 두 가지 모두에 대해 동일한 결과를 생성합니다.

앞에 print "hello"를 추가하는지, 마지막 명령을 (print $some 대신) "print"로 바꾸는지 여부에 따라 다른 결과가 생성됩니다.

그러나 그들은 모두 공백 대신 뭔가를 인쇄합니다. 저는 아직 이 효과를 재현하는 버전을 찾지 못했습니다.

그래서 저는 이것이 초기화되지 않은 변수를 사용하여 발생하는 일종의 정의되지 않은 동작일 것이라고 예상했습니다.가능한 열 범위의 끝을 훨씬 넘어서는 열에 값을 할당하고 있습니다.입력 스트림에서. $some은 "some" 값으로 식별되는 열을 나타냅니다.

변수로는 "some"만 사용해야 합니다.

df | awk '{print "hello";some=$2; print some}'

답변3

내 생각에 이런 일이 일어나는 이유는 Ubuntu가 표준 GNU 이식을 사용하지 않고 표준 Unix에서 작동하는 많은 코드를 깨뜨리는 mawk라는 다른 것을 사용하기 때문이라고 생각합니다.

이것을 참고하세요협회비슷한 토론을 해보세요.

관련 정보