我有以下示例数据:
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
答案 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