次のデータがあります。
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
のようなものは「フィールドトークン化」を意味します。これは、フィールド間の不一致を無視し、フィールドを識別して抽出するために使用される正規表現を指定します。FS
ft
皮肉なことに、
ft
Awkの基本フィールド区切り文字の意味は直接表現できます。先頭と末尾の改行とスペースはレコードから切り捨てられ、1 つ以上の改行またはスペースで区切られます。これは単に次のものとまったく同じです。積極的にフィールドを空白ではなく構成されたトークンとして認識します。 Awkに変数がある場合は、単一のスペースに等しい場合に適用される特別なトリックはFT
必要ありませんFS
。デフォルト値はFS
設定されず、代わりにFK
regexに設定できます[ \t\n]+
。
ft
数字を識別し、小数点を強制し、数字を強制する簡単な方法を使用します。先行記号もなく、オプションもありません。
マクロmf
(「フィールドマッピング」)は各フィールドを作業パイプラインに配置します。まず、このtofloat
関数は文字列を浮動小数点に変換します。次に、floor
負の無限大方向に最も近い整数に切り捨てます。toint
ingerに戻って(* 100)
追加の引数を取り、その結果を乗算する関数toの部分的な適用を表現しましょう。この部分適用構文は、引数が暗黙的に構文(TXR Lisp明示的に部分適用演算子)として扱われるという事実に従います。*
100
100
mf
op
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)