Shell-Script
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)
簡而言之,我首先需要將兩列相除並取 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 <
但我不能將它與最後一個按列劃分的程式碼結合起來。我是否缺少一些語法
BEGIN
或END
用法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