列が浮動状態であることを確認する

列が浮動状態であることを確認する

熱が浮動していることを確認したい要件があります。浮動小数点の場合、他の接続は行われません.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のフルライン印刷の秘密の略語です。

関連情報