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

时间:2017-04-07 10:20:29

标签: 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)
(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

使用此逻辑输出将减少一行,因为第二行将消耗第一行。

以下数据出错:

 104937 20776001011 6893034089
 104937 20776001011 6893034089
 104938 20776062501 6893040119
 104938 20776062501 6893040119
 104938 20776062501 6893040119
 104938 20776062501 6893040119
 104938 20776062501 6893040119
 104939 20776124802 6893047227
 104939 20776124802 6893047227
 104939 20776124802 6893047227
 104939 20776124802 6893047227
 104940 20776178348 6893051452
 104940 20776178348 6893051452
 104940 20776178348 6893051452
 104940 20776178348 6893051452
 104940 20776178348 6893051452
 104941 20776235367 6893055075
 104941 20776235367 6893055075
 104941 20776235367 6893055075
 104941 20776235367 6893055075


61490 6030
awk: cmd. line:1: (FILENAME=- FNR=4) fatal: division by zero attempted

3 个答案:

答案 0 :(得分:4)

另一个使用awk。每个记录都是split到数组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

您可以使用print格式化输出格式而不只是printf原始值:printf "%.01f %.01f\n", ... 被盗引用(并奖励:)来自@ RavinderSingh13的回答......它会输出:

3.0 1.0
0.3 0.7

%g %g会输出:

3 1
0.333333 0.666667

只需选择哪种输出类型与您偏好的输出类型不同。

答案 1 :(得分:4)

另一种选择(使用粘贴和awk)以获得乐趣:

paste file <(tail +2 file)|awk 'NF==6 && NR>1{a=$4-$1;b=$5-$2;c=$6-$3;
                                         printf "%.1f %.1f\n", b/a,c/a}'

答案 2 :(得分:3)

@mnok:@try:如果您的Input_file与示例文件相同。

 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