`... | 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 # 強制記録の再編成

おすすめ記事