내 이해로는 $1
첫 번째 필드입니다. 그런데 이상하게 awk '$1=$1'
여분의 공백이 생략됩니다.
$ echo "$string"
foo foo bar bar
$ echo "$string" | awk '$1=$1'
foo foo bar bar
왜 이런 일이 발생합니까?
답변1
즉, 필드 변수에 값을 할당할 때입니다. 값은 $1
필드에 할당되며 $1
awk는 실제로 이를 $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
구분 기호로 모든 필드를 연결하여 이를 수행합니다 . OFS
AWK가 레코드를 구문 분석할 때 $0
전체 레코드는 있는 그대로 포함되며 필드가 $1
포함 $NF
되면(구분자 없이) $0
필드 값에서 재구성됩니다.
이 예에서 AWK의 출력 여부는 입력에 따라 다릅니다.
echo "0 0" | awk '$1=$1'
아무것도 출력되지 않습니다. $1=$1
첫 번째 필드에 있는 내용을 평가합니다 0
. 이는 AWK에서 "거짓" 결과이므로 아무 일도 일어나지 않으며 출력도 제공되지 않습니다. 이를 방지하려면 $1=$1
조치를 취하고 AWK가 모든 경우에 현재 레코드를 인쇄하도록 하십시오.
| awk '{$1=$1}1'
1
AWK가 항상 기본 작업을 실행하도록 합니다.