パイプ区切り文字にソースファイルがあり、先行ゼロを削除する必要があります。
初期ファイル:
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
numfmt
GNU の 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||