如何为每个唯一ID划分和打印字段的开头?

时间:2017-01-03 09:48:59

标签: awk

对于每个唯一ID($ 1),我需要将$6的第一条记录除以$4的第一条记录。

4   2016-07-19  06:09:50  546.5    3 11.5  
4   2016-07-20  06:40:03  543.667 3  11.5  
4   2016-07-21  05:43:18  539   3    11.5  
4   2016-07-22  07:18:20  535  3     11.5  
10  2016-07-20  08:08:45  488  3     17.5  
10  2016-07-21  07:32:35  490.5 3    17.5   
10  2016-07-23  06:01:58  470.5 3    17.5  
10  2016-07-24  08:26:02  472  3     17.5  

输出看起来像这样,

4   2016-07-19  06:09:50  546.5    3 11.5  0.02  
4   2016-07-20  06:40:03  543.667 3  11.5  0.02   
4   2016-07-21  05:43:18  539   3    11.5  0.02  
4   2016-07-22  07:18:20  535  3     11.5  0.02  
10  2016-07-20  08:08:45  488  3     17.5  0.036  
10  2016-07-21  07:32:35  490.5 3    17.5  0.036   
10  2016-07-23  06:01:58  470.5 3    17.5  0.036  
10  2016-07-24  08:26:02  472  3     17.5  0.036  

3 个答案:

答案 0 :(得分:1)

$ awk 'p!=$1{q=sprintf("%.3f", $6/$4)} {$(NF+1)=q;p=$1}1' file
4 2016-07-19 06:09:50 546.5 3 11.5 0.021
4 2016-07-20 06:40:03 543.667 3 11.5 0.021
4 2016-07-21 05:43:18 539 3 11.5 0.021
4 2016-07-22 07:18:20 535 3 11.5 0.021
10 2016-07-20 08:08:45 488 3 17.5 0.036
10 2016-07-21 07:32:35 490.5 3 17.5 0.036
10 2016-07-23 06:01:58 470.5 3 17.5 0.036
10 2016-07-24 08:26:02 472 3 17.5 0.036

说明:

p!=$1 {                       # when the $1 changes
    q=sprintf("%.3f", $6/$4)  # calculate the value q to append to records
} 
{                             # for all records
    $(NF+1)=q                 # append q to them
    p=$1                      # remember previous $1
} 1                           # print

答案 1 :(得分:0)

awk救援!

$ awk '!($1 in a){a[$1]=$6/$4} {printf "%s\t%.3f\n",$0,a[$1]}' file

4   2016-07-19  06:09:50  546.5    3 11.5       0.021
4   2016-07-20  06:40:03  543.667 3  11.5       0.021
4   2016-07-21  05:43:18  539   3    11.5       0.021
4   2016-07-22  07:18:20  535  3     11.5       0.021
10  2016-07-20  08:08:45  488  3     17.5       0.036
10  2016-07-21  07:32:35  490.5 3    17.5       0.036
10  2016-07-23  06:01:58  470.5 3    17.5       0.036
10  2016-07-24  08:26:02  472  3     17.5       0.036

您的输出格式不一致(2或3个十进制数字),有方法可以完全匹配但不确定它是故意的。

答案 2 :(得分:0)

@ Alula-和karakfa一样的逻辑,但是尽管首先要经过循环再打印,然后在打印本身内进行检查。

awk '{printf "%s\t%.3f\n",$0,!a[$1]?a[$1]=$6/$4:a[$1]}'  Input_file

我希望这会对你有所帮助。