AWKは、インライン分割をシミュレートして絶対値を取るために使用されます。

AWKは、インライン分割をシミュレートして絶対値を取るために使用されます。

次の形式のデータファイルがあります。 (上行は参考用です。)

    E          T               N         D                 S             s                 R          k
   0.45847  300.0000      9.99979156  0.44254427E+02  0.49221658E-04  0.98763353E+19  0.73239256E-09  0.24892539E+15
   0.45947  300.0000      9.97603847  0.51763106E+02 -0.24189016E-04  0.97909193E+19 -0.24467623E-08  0.23855274E+15

これで、次のものを含む同じ列形式のファイルを生成する必要があります。

N         (k/(s/300.0000))         Abs(S)/E         exp(Abs(S)/E)

つまり、最初に2つの列を分割し、Column(5)の絶対値を取ってから、再び二乗を実行する必要があります。

私はコードを使用しています:

while read -a line; do echo -e " ${line[2]}\t" `awk "BEGIN {print ${line[7]}/${line[5]}/300}"` ; done < filename

しかし、これを行うと、2番目の列だけが表示されます。 CIは、次の2つの列のように絶対値を取る必要がありますか?

私はすでに到着しました:

 while read -a line; do echo -e ${line[4]} | awk ' { if($line[4]>=0 ) {print $line[4] } else {print $line[4]*(-1)} }'; done <

ただし、最後の列単位の除算コードと組み合わせることはできません。いくつかの構文BEGINEND使用法がありませんかawk?結果を10進形式で表示するのも混乱しています。 ㅏ

PS:awkこれを行うのに適したツールですか?私はそれを試したいですかpython?このようなファイルが20個を超えるため、スプレッドシートが利用できないことがわかります。

ベストアンサー1

はい、awkこれは正しいツールです。次のようにできます。

$ awk 'function abs(x) {return x<0 ? -x : x}
     NR>1{printf ("%e %e %e %e\n", $3, $NF/($6/300.0000), abs($5)/$1, exp(abs($5)/$1) );
}' infile

9.999792e+00 7.561268e-03 1.073607e-04 1.000107e+00
9.976038e+00 7.309408e-03 5.264547e-05 1.000053e+00

上記のように abs() 関数をシミュレートしたり、関数を定義したりせずに三項演算子を使用して、次のように生成できます。

$ awk 'NR>1{ $5*=($5<0?-1:1);
    printf("%e %e %e %e\n", $3, $NF/($6/300.0000), $5/$1, exp($5/$1) )}' infile
9.999792e+00 7.561268e-03 1.073607e-04 1.000107e+00
9.976038e+00 7.309408e-03 5.264547e-05 1.000053e+00

おすすめ記事