元のファイルが次のようになっているとします。
N O D E O U T P U T
THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
NODE FOOT- NT11
NOTE
3 20.00
11 20.00
1003 23.75
1011 23.75
2003 27.52
2011 27.52
3003 31.30
3011 31.30
4003 35.08
2番目のファイルを生成する必要がありますが、2番目の列の値に100を掛けるだけです。このファイルをどのように入手できますか?
答え1
数値データブロックのフィールド幅と形式を維持すると仮定すると、次のようなものが提案されます。
awk '
$1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {
$0 = sprintf("%6d%12.2f", $1, 100*$2)
} 1
' file
前任者。
$ awk '$1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {$0 = sprintf("%6d%12.2f", $1, 100*$2)} 1' file
N O D E O U T P U T
THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
NODE FOOT- NT11
NOTE
3 2000.00
11 2000.00
1003 2375.00
1011 2375.00
2003 2752.00
2011 2752.00
3003 3130.00
3011 3130.00
4003 3508.00
答え2
私は要求を単に2番目の列の数に100を掛けた結果の出力として解釈することにしました。
これは、ヘッダーが静的で常に6行の長さであると仮定します。無視されます。
$ awk 'FNR > 6 { print 100*$2 }' <infile
2000
2000
2375
2375
2752
2752
3130
3130
3508
FNR > 6
少なくとも6行を読み取ると、条件は2番目のフィールドを掛けて出力するブロックをトリガします。
ヘッダーの長さがわからない場合は、次のものをFNR > 6
使用できます。$2 ~ /^-?[0-9.]+$/
子供のような2番目のフィールドが浮動小数点かどうかをテストする方法でオプションで署名されます(「オプションの-
後に数字と点のみが表示されます」)。
答え3
出力が「outfile」というファイルに保存されていると仮定すると、ここに別の解決策があります。ただし、数値データを含む列の形式は維持されないことに注意する必要があります。
awk '{if(/^ *[0-9\.]+ *[0-9\.]+ *$/) {var=$2*100; print $1,var;} else { print $0 }}' outfile