小数点以下の桁を削除してカンマをキャンセル

小数点以下の桁を削除してカンマをキャンセル

次のデータがあります。

cat file
(4567.99,5678.98)
(5678.33,6734.34)

私が望む出力は次のとおりです。

(45679900 56789800)
(56783300 67343400)

小数点をキャンセルして8桁にし、間にスペースがあるようにカンマ記号を削除したいと思います。

awkコマンドを使用するには?sedそれも大丈夫です。

答え1

awkを使用してください:

awk -F'[(),]' '{ printf( "(%d %d)\n", $2 * 10000, $3 * 10000 ); }' file

答え2

sed -e 's/,/ /' -e 's/\.\(..\)/\100/g'

答え3

TxRマクロ:実際には、入力された操作でこれを実行できます。データを浮動小数点値として取り、最も近い整数に丸め、100を掛けて整数に変換します。

しかし、しばらくやめて考えてみてください。値が大きすぎて最も近い整数に切り捨てられない場合は、ランダムに大きい値については悪い考えかもしれません。テキストでこれを行うのが正しいです。

$ txr -e '(awk (:begin (set ft #/\d+.\d+/))
               ((mf tofloat floor toint (* 100))))'
(4567.99, 123.45, junk 3.1415, 1.0 ...) x
456700 12300 300 100

変数ftは新機能です。クラシックAwkには対応する機能はありません。 (フィールド区切り記号)fsのようなものは「フィールドトークン化」を意味します。これは、フィールド間の不一致を無視し、フィールドを識別して抽出するために使用される正規表現を指定します。FSft

皮肉なことに、ftAwkの基本フィールド区切り文字の意味は直接表現できます。先頭と末尾の改行とスペースはレコードから切り捨てられ、1 つ以上の改行またはスペースで区切られます。これは単に次のものとまったく同じです。積極的にフィールドを空白ではなく構成されたトークンとして認識します。 Awkに変数がある場合は、単一のスペースに等しい場合に適用される特別なトリックはFT必要ありませんFS。デフォルト値はFS設定されず、代わりにFKregexに設定できます[ \t\n]+

ft数字を識別し、小数点を強制し、数字を強制する簡単な方法を使用します。先行記号もなく、オプションもありません。

マクロmf(「フィールドマッピング」)は各フィールドを作業パイプラインに配置します。まず、このtofloat関数は文字列を浮動小数点に変換します。次に、floor負の無限大方向に最も近い整数に切り捨てます。tointingerに戻って(* 100)追加の引数を取り、その結果を乗算する関数toの部分的な適用を表現しましょう。この部分適用構文は、引数が暗黙的に構文(TXR Lisp明示的に部分適用演算子)として扱われるという事実に従います。*100100mfop

mf結果ではない値が返されるため、デフォルトのnilジョブは(prn)更新されたフィールドの印刷を開始します。この印刷は、rec更新されたフィールドを単一の空白文字で構成されるデフォルトフィールドにofs関連付けることによって再編成され、出力はデフォルトでors改行文字に設定されます。

これは浮動小数点数学に依存せずに数値的に計算を行う方法です。デフォルトでは、同じ正規表現を使用してフィールドを抽出できますが、テキスト中に点を削除することはできます。次に整数に移動し、切り捨てられた整数除算と乗算を使用します。

 $ txr -e '(awk (:begin (set ft #/\d+.\d+/))
                ((mf (remq #\.) toint (trunc @1 100) (* 100))))'

この言語では整数がランダムに大きくなる可能性があるため、このソリューションは非常に大きな数字の問題を示していませんが、テキスト処理を最小限に抑えます。

答え4

awk '{gsub(/\./,"")sub(/,/," "); print $1"00",$2}' file
(45679900 567898)
(56783300 673434)

関連情報