awkを使用して、パイプで区切られたファイルから先行ゼロを削除します。

awkを使用して、パイプで区切られたファイルから先行ゼロを削除します。

パイプ区切り文字にソースファイルがあり、先行ゼロを削除する必要があります。

初期ファイル:

010N00000001|20100111|20150112|PA|3|00001|41|+0000000100.00|+0000000000.00|+0000000000.00|022|R| |
010N00000001|20100115|20150115|PA|3|00001|41|-0000000050.00|+0000000000.00|+0000000000.00|022|R| |

希望の出力:

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||

awk誰でも上記の構文を提供できますか?より多くの属性がありますが、6番目と8番目のソース属性と対応する6番目と8番目の出力属性の値を知りたいです。

答え1

たとえば、fileデータが含まれている場合:

awk -F\| -v OFS=\| '{ $6  = sprintf( "%.0f",  $6  )
                      $8  = sprintf( "%.2f",  $8  )
                      $9  = sprintf( "%.0f",  $9  )
                      $10 = sprintf( "%.0f",  $10 )
                      print }' file

この-F\|オプションは、(入力)フィールド区切り記号をパイプ記号として設定し、-v OFS=\|出力フィールド区切り記号にも同様に適用されます.割り当てのある行は - 関数を使用してそのフィールドの書式を再指定し(同じパラメータで印刷された内容を返しsprintf()ます)、最後に - 関数を使用して書式が完全に変更されたレコードを出力します。printf()print

再フォーマットする場合は、sprintf()いくつか選択できます。制御文字そして関連修飾子。このリンクはGNU awkドキュメントを指していますが、ほとんどの文字は非常に一般的です。

答え2

この試み、

awk 'BEGIN{OFS=FS="|"}{$6=sprintf("%1.0f",$6);$8=sprintf("%3.2f",$8);$9=sprintf("%1.0f",$9);$10=sprintf("%1.0f",$10)}1;' tt.txt

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R| |
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R| |
  • %Xここで、Xは必須の数値です。
  • .xfここで、xは必須小数点です。

源泉

答え3

numfmtGNU の GNU Coreutils パッケージは、これらのタスクに役立ちます。残念ながら、まだ多重仕様を受け入れていないようで、--field単項--format数を処理していないようです+。いくつかの議論があります:

$ sed 's/[+ ]//g' file | 
    numfmt -d'|' --field=8 --format='%.2f' | numfmt -d'|' --field=6,9,10 --format='%.0f'
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||

答え4

次のコマンドを試してみましたが、期待どおりに正しく機能しました。

k=`awk '{print NF}' example.txt | sort -nr| sed -n '1p'`

for ((j=1;j<=2;j++)); do for((i=1;i<=$k;i++)); do awk -F "| -v i="$i" -v j="$j"  'NR==j{print $i}' example.txt| sed "s/^[+-]//g"| sed "s/^0\{2,\}//g"| sed "s/^\..*/0/g"; done| tr "\n" "|"| sed 's/|$//g'| sed 's/^|//g'; done| sed -r "s/\s+/|\n/g"| sed "s/^|//g"

出力

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|50.00|0|0|022|R||

関連情報