熱が浮動していることを確認したい要件があります。浮動小数点の場合、他の接続は行われません.00
。
文書:
2017 47.0000 0.783333 0.2500
1663 1920.0000 32 8.0000
予想出力:
2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000
注文する:
awk -F" " '{if ($9=="^[0-9]") {print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7$8} else {print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7}}' | head -1
答え1
awk '$3 !~ /\./ { sub($3, $3 ".00") } { print }' columns
明らかに、この推奨事項はサンプル入力に基づいています。これは次のように機能します。 3番目の列(OPのコードは9番目の列を使用しますが、入力例はそれほど長くありません)にリテラルポイントが含まれていない場合は、3番目の列を3番目の列とリテラル文字列.00
(つまり列に文字列を追加します。かどうかにかかわらず、行を印刷します。このコマンドは1
一部のユーザーによって短縮されて使用されますが、私はこのコマンドがあまりにも秘密であると思います。
このソリューションでは、列自体を置き換えるのではなく文字列置換を使用するため、安全ではありません。
答え2
最初の列以降のすべての列で整数を見つけて、次を追加します.00
。
$ awk '{for (i=2;i<=NF;i++) if (!($i ~ /[.]/))$i=$i ".00"} 1' input
2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000
どのように動作しますか?
for (i=2;i<=NF;i++)
i=2
これにより、2番目のフィールドから始まり最後のフィールドに移動するフィールドループが始まりますi=NF
。if ( !($i ~ /[.]/))$i=$i ".00"
各ループについて、i番目のフィールドにピリオドが含まれていることを
i
確認してください。$i
もしそうなら、($i ~ /[.]/)
trueと評価されます。しかし、私たちはこの結果を否定します。フィールドが次の場合にのみ!($i ~ /[.]/)
trueです。i
いいえピリオドが含まれています。その場合は、.00
フィールドの末尾に追加しますi
。これ
if
はループの唯一のドアですfor
。1
これはawkのフルライン印刷の秘密の略語です。