私はラインを持つファイルがあります:浮動小数点フィールドの編集AWKの空白での保存/埋め込み?
CH1 12.30 4.800 12 !
私は特定のフィールドを置き換えたい...と言う$2
[0.0,1.0)
に選ばれた浮動小数点スカラーでスケーリングし、いくつかの同等とします。しかし、元の長さを維持するために、10進数と同じ数を保持し、さらにフロントエンドをスペースで埋めたいと思っています。
私はいくつかの組み合わせを考えていますlen
/gsub
/printf
のawk
がこれを達成できます。私は現在試みているものの例として
:
scalar=0.00; echo 'CH1 12.30 4.800 12 !' | awk -v sc=$scalar '/CH1/{gsub(/[0-9]*\.[0-9]*/,$2*sc,$2);} {print;}'
出力:
CH1 0 4.800 12 !
は出力: が正しくスケール#を出力しますが、スペースがないだけで、フィールド$2
から取り除かれ、ライン全体です。
scalar=0.00; echo 'CH1 12.30 4.800 12 !' | awk -v sc=$scalar '/CH1/{gsub(/$2/,$2*sc,$0);} {print;}'
出力:
CH1 12.30 4.800 12 !
注: は何もしません!出力は変更されません。
仮定:
- フィールド
$2
と$3
は同じかもしれないが、私は唯一のフィールド$2
を変更したいです。 - フィールド
$1
には英数字のみが含まれます。 - フィールド
$2
および$3
は、任意の10進数の桁数を持つ浮動小数点数です。通常、桁数は[1,4]
です。全体の部分は3桁を超えません。 - フィールド
$4
は、[8,99]
の整数です。 - フィールド
$4
以降の文字はすべてコメントであり、特殊文字を含む場合があります。
私は空白の保存に関するいくつかの質問に遭遇してきた同様の質問を検索し、それらは私にいくつかのアイデアを与えた...しかし、私は実際には小数点以下を保つために、空白文字を追加したいので、私のは少し異なっています実際には行の同じ場所にロックされ、ユーザーの書式設定を目的のファイルに保存することができます。 /$2/
リテラル$2
文字列を探しているので、フィールド2である(そして、我々は一つだけなので、無地sub
で十分に変化しているので、gsub
はやり過ぎであるものは何でもとは対照的に、
あなたは '.... | awk -v sc = "$スカラー" ... '、そうですか?がんばろう。 – shellter
書式を扱うだけの余分なロジックを構築しているようです。あなたの計算ステップをパイプを介してフォーマットステップに渡すことで、フォーマットを管理するだけの簡単な方法はありません。 (たぶんあなたはある時点で幅を変えたいと思うでしょう)、つまり '... | awk -v sc = "$スカラー" ... | awk '{printf( "%8s%10s%-06s \ n"、$ 1、$ 2、$ 3)} "です。ちょうどアイデア。がんばろう。 – shellter
合理的なアプローチのようだ...私はちょうどawkでこれを行うより管理しやすい方法があるかどうか疑問に思っていた。 –