Shell-Script

AWK 用於模擬內聯除法並取絕對值

  • November 20, 2018

我有一個這種格式的數據文件(頂行供參考):

   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)

簡而言之,我首先需要將兩列相除並取 Column(5) 的絕對值,然後再次執行求冪。

我正在使用程式碼:

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

但這只會讓我進入第二列。CI 需要在接下來的兩列中取絕對值嗎?

我來了,直到:

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?結果也以十進制格式出現混亂。一種

PS:這awk是正確的工具嗎?我要試試python還是什麼?我知道我不能使用電子表格,因為我將擁有超過 2 打這樣的文件。

是的,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

引用自:https://unix.stackexchange.com/questions/438388