純粋な猫の代わりに、このコマンドライン(/usr/bin/awk '{$1=$1};1')の利点は何ですか?

純粋な猫の代わりに、このコマンドライン(/usr/bin/awk '{$1=$1};1')の利点は何ですか?

AWSを読んでいます。eic_harvest_hostkeysスクリプト、次の行を理解できません。

key=$(/usr/bin/awk '{$1=$1};1' < "${file}")

awkの利点は何ですか?もっと良くないですかkey=$(/bin/cat "${file}")

答え1

key=$(/bin/cat "${file}")key改行なしでファイルの内容に設定します。 (ヌルバイトではなくテキストファイルであると仮定します。)

key=$(/usr/bin/awk '{$1=$1};1' < "${file}")水平スペースの正規化:各行の先頭と末尾からスペースとタブを削除し、内部スペースとタブ順序を単一のスペースに圧縮します。$1=$1うまくいかないようですが、実際には、awkに更新されたフィールドに基づいて行を書き換えさせ、行を書き換えると、フィールドの周りの空白情報が削除されます。その後、末尾の改行文字も削除します。


¹ $fileaで始まらない場合は、オプションパラメータとして扱われます-cat使用する方が良いでしょうkey=$(cat < "$file")key=$(cat -- "$file")また改善されますが、file='-'それでも問題です)。

答え2

入力行を標準形式に強制的に$1書き換える割り当て。awk

{ echo 'one  two  three'; echo '  indented with trailing  '; } | cat
one  two  three
  indented with trailing

{ echo 'one  two  three'; echo '  indented with trailing  '; } | awk '{$1=$1}; 1'
one two three
indented with trailing

また、ダッシュfile=-xで始まるファイル名を参照するとkey=$(<"$file")正しく機能しますが、多くの(すべて?)実装の場合key=$(cat "$file")と同様にエラーが発生します。cat: unknown option -- xcat

答え3

でもこれも長すぎます。ただし:

[m/n/g]awk NF=NF

NF左側の最初の引用符はシェルが等号=で何もしないようにするため、シェルレベルでは引用符は必要ありません。

関連情報