Bash 在当前行中使用上一行进行数学运算

Bash 在当前行中使用上一行进行数学运算,bash,awk,Bash,Awk,我有以下样本数据: co1 co2 co3 100 200 300 110 230 310 125 235 320 我需要对数据执行以下逻辑: (col2 - col2 of the previous line)/(col1 - col1 of previous line) (col3-col3 of the previous line)/(col1 - col1 of previous line) 这意味着: (230-200)/(110-100) (310-300)/(110-100)

我有以下样本数据:

co1 co2 co3
100 200 300
110 230 310
125 235 320
我需要对数据执行以下逻辑:

(col2 - col2 of the previous line)/(col1 - col1 of previous line) (col3-col3 of the previous line)/(col1 - col1 of previous line) 
这意味着:

(230-200)/(110-100) (310-300)/(110-100)
(235-230)/(125-110) (320-310)/(125-110)
我试过:

cat sample |awk 'NR>1' |'NR>1{f=$1;s=$2;t=$3;next} {print f,s;print $2-s/$1-f,$3-t/$1-f}'
期望输出:

3   1
0.3 0.6
使用此逻辑输出将减少一行,因为第一行将被第二行占用

以下数据错误:
@mnok:@try:如果您的输入文件与显示的示例文件相同

 awk 'NR>2{printf("%.01f %.01f\n",($2-last_2)/($1-last_1),($3-last_3)/($1-last_1));} NR>1{last_1=$1;last_2=$2;last_3=$3}'  Input_file

另一个使用awk。每个记录被
分割成一个数组
a
,在下一次迭代中使用:

$ awk 'NR>2{print ($2-a[2])/($1-a[1]),($3-a[3])/($1-a[1])} NR>1{split($0,a)}' file
3 1
0.333333 0.666667
您可以使用
printf
格式化输出,而不只是
print
原始值:
printf“%.01f%.01f\n”,…
从@RavinderSingh13的答案中引用(并奖励:)。。。它将输出:

3.0 1.0
0.3 0.7
3 1
0.333333 0.666667
%g%g
将输出:

3.0 1.0
0.3 0.7
3 1
0.333333 0.666667
只需选择与首选输出类型差异最小的输出类型。

另一种选择(带有粘贴和awk)可供选择:


粘贴文件总是3行吗?仅限实际行和3列?否,在缺少第二个管道命令awk后,有100+行CAT无效,因为这两个管道,还有括号,因为优先级为/over-Do。请注意,上述结果输出中的
0.7
是因为四舍五入到下一个更高的数字,而不是错误的结果。您可以使用
%g
而不是
%.01f
来获得稍微更好的格式。行:1:(FILENAME=-FNR=4)致命:尝试用零除实际数据
,如何将检查添加到此异常?您的输入文件中是否有空行?如果是,那么您可以使用
split()
将条件lie NR>&&NF和NR>1&&NF添加到itLooks中;我试图得到这个逻辑,但不知怎的浪费了它@我知道,是GIF而不是TGIFDgot
awk:cmd。第1行:(FILENAME=-FNR=4)致命:尝试用零除法
对于实际数据,如何向此异常添加检查?听起来除法器中有一个零。这意味着两个连续的
$1
s中的值相同:
$1-a[1]==0
。问题是,在这种情况下,您希望输出什么。是的,将
($1-a[1])
替换为
($1-a[1])+($1-a[1]==0?1:0))
。后一部分的意思是:
如果($1-a[1]==0),则添加1,否则添加0。第1行:(FILENAME=-FNR=4)致命:尝试用
真实数据除以零,如何将检查添加到此异常?@monk检查
a
是否为零,以执行错误处理。例如,在printf之前,如果
a=0,则执行
a=a?a:1
设置
a=1