我有一个这种格式的数据文件(顶行仅供参考):
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
?结果以十进制格式显示也是混乱的。 A
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
exp(x)
功能在awk- 如何使用awk取绝对值?
答案2
如果您想使用 python 脚本执行此操作:
#!/usr/bin/env python
##
# use: ingest.py infile1 infile2 ... infilen
import math,re,argparse
parser = argparse.ArgumentParser()
parser.add_argument('infiles', type=str, help='infile names', nargs='+')
args = parser.parse_args()
for infile in args.infiles:
with open(infile) as in_file, open(infile+".out", "w+") as out_file:
column_names = in_file.readline().split()
out_file.write("N (k/(s/300.0000)) Abs(S)/E exp(Abs(S)/E)\n")
for line in in_file.readlines():
column_values = [float(x) for x in line.split()]
value_dict = dict(zip(column_names,column_values))
div = value_dict["k"]/(value_dict["s"]/300.0000)
ABS = abs(value_dict["S"])/value_dict["E"]
EXP = math.exp(abs(value_dict["S"])/value_dict["E"])
out_file.write("{N} {DIV} {ABS} {EXP}\n".format(N=value_dict["N"],DIV=div,ABS=ABS, EXP=EXP))