`... | awk '$1=$1''` 추가 공백을 제거하는 방법은 무엇입니까?

`... | awk '$1=$1''` 추가 공백을 제거하는 방법은 무엇입니까?

내 이해로는 $1첫 번째 필드입니다. 그런데 이상하게 awk '$1=$1'여분의 공백이 생략됩니다.

$ echo "$string"
foo    foo bar               bar

$ echo "$string" | awk '$1=$1'
foo foo bar bar

왜 이런 일이 발생합니까?

답변1

즉, 필드 변수에 값을 할당할 때입니다. 값은 $1필드에 할당되며 $1awk는 실제로 이를 $0기본 필드 구분 기호(또는 OFS공백)와 연결하여 재구성합니다.

다음 시나리오에서도 동일한 상황이 발생할 수 있습니다.

echo -e "foo foo\tbar\t\tbar" | awk '$1=$1'
foo foo bar bar

echo -e "foo foo\tbar\t\tbar" | awk -v OFS=',' '$1=$1'
foo,foo,bar,bar

echo -e "foo foo\tbar\t\tbar" | awk '$3=1'
foo foo 1 bar

GNU AWK의 경우 이 동작은 여기에 문서화되어 있습니다.
https://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html

$1 = $1 # 강제 기록 재구성

답변2

echo "$string" | awk '$1=$1'

AWK가 $1=$1필드를 자체에 할당하는 평가를 수행하도록 $0하고 AWK는 표현식의 값을 고려하며 0도 아니고 null도 아니기 때문에 기본 작업을 수행합니다. 인쇄 $0.

AWK가 다시 계산하면 추가 공백이 제거됩니다 . 기본적으로 공백인 $0구분 기호로 모든 필드를 연결하여 이를 수행합니다 . OFSAWK가 레코드를 구문 분석할 때 $0전체 레코드는 있는 그대로 포함되며 필드가 $1포함 $NF되면(구분자 없이) $0필드 값에서 재구성됩니다.

이 예에서 AWK의 출력 여부는 입력에 따라 다릅니다.

echo "0      0" | awk '$1=$1'

아무것도 출력되지 않습니다. $1=$1첫 번째 필드에 있는 내용을 평가합니다 0. 이는 AWK에서 "거짓" 결과이므로 아무 일도 일어나지 않으며 출력도 제공되지 않습니다. 이를 방지하려면 $1=$1조치를 취하고 AWK가 모든 경우에 현재 레코드를 인쇄하도록 하십시오.

| awk '{$1=$1}1'

1AWK가 항상 기본 작업을 실행하도록 합니다.

관련 정보