awk $0 및 $1은 파일과 bash에서 실행될 때 다르게 동작합니다.

awk $0 및 $1은 파일과 bash에서 실행될 때 다르게 동작합니다.

이것이 awk의 기능인지는 모르겠지만 awk 프로그램 파일을 사용하고 $0vs를 사용하면 .$1-fbash command line

다음 테스트 파일을 가져옵니다.

a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x

Bash 명령줄에서 다음 명령을 사용할 때:

awk "{ print $1 }" sample_input.txt

다음과 같은 결과가 나타납니다.

a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x

보시다시피 이는 $1이 아닌 $0의 출력입니다. $0은 빈 줄만 출력합니다.

이제 awk 명령에서 동일한 명령을 사용하면 올바른 출력을 얻습니다.

{ print $1 }
awk -f test.awk sample_input.txt

a
a
a
a
a
a,bc,

우분투 18.04를 사용하고 있습니다.이거 좀 이상한 기능인가요 awk?

답변1

이것은 이상한 기능은 아니지만 awk쉘이 큰따옴표 안의 변수를 처리하는 일반적인 방식 때문입니다.

지휘 중

awk "{ print $1 }" sample_input.txt

awk코드가 큰따옴표로 묶여 있기 때문에 쉘은 $1첫 번째 위치 인수(일반적으로 스크립트 또는 쉘 함수의 첫 번째 명령줄 인수)의 값을 대체합니다. 값이 비어 있거나 설정되지 않은 경우 awk스크립트 는

awk "{ print }" sample_input.txt

그 효과는 다음과 같습니다.

cat sample_input.txt

쉘 확장을 방지하려면 스크립트를 $1작은따옴표로 묶으십시오 awk.

awk '{ print $1 }' sample_input.txt

POSIX 표준은 큰따옴표와 작은따옴표를 사용하여 셸의 동작을 설명합니다.

문자를 작은따옴표( '')로 묶으면 작은따옴표 안에 있는 각 문자의 리터럴 값이 유지됩니다. 작은따옴표 안에는 작은따옴표가 포함될 수 없습니다.

큰따옴표( )로 묶인 문자는 다음과 같이 백틱, , 및 ""문자를 제외하고 큰따옴표 안의 모든 문자의 리터럴 값을 유지합니다 .<dollar-sign><backslash>

$

매개변수 확장은 도입 후에도 <dollar-sign>특별한 의미를 유지 해야 합니다.(매개변수 확장 참조), 명령 대체 형태(명령 대체 참조) 및 산술 확장(산술 확장 참조).

[...]

(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_02)

관련 정보