2番目の列で数学演算を実行します。

2番目の列で数学演算を実行します。

元のファイルが次のようになっているとします。

            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

関連情報