在特定条件后选择行

时间:2018-08-20 11:52:12

标签: awk

在找到最大最小勇气之后选择行

输入文件

22 101 5
23 102 5
24 103 5
25 104 23
26 105 25
27 106 21
28 107 20
29 108 8
30 109 6
31 110 7

要弄清楚我的问题,我尝试减去第3列并在第4列中找到的最小值之后打印行。在这种情况下,在第7行之后

awk '{$4 = $3 - prev3; prev3 = $3; print $0}' file

22 101 5 
23 102 5 0
24 103 5 0
25 104 2 18
26 105 2 2
27 106 2 -4
28 107 2 -1
29 108 8 -12
30 109 6 -2
31 110 7 1

所需的输出

29 108 8
30 109 6
31 110 7

我相信有更好,更简单的方法来获得相同的输出。

预先感谢

1 个答案:

答案 0 :(得分:3)

您需要将同一文件处理两次:

  1. 找出最小值的行号
  2. 打印行及其后的行

赞:

awk 'NR==FNR{v=$3-prev3;prev3=$3;if(NR==2||v<m){m=v;ln=NR};next}FNR>=ln' file file

说明:

# This condition is true as long as we process the file the first time
NR==FNR {

    # Your calculation
    v=$3-prev3
    prev3=$3

    # If NR==2, meaning in row 2 we initialize m and ln.
    # Otherwise check if v is the new minimum and set m and ln.
    if(NR==2 || v<m){
        # Set m and ln when v is the new minimum
        m=v
        ln=NR
    }

    next # Skip the conditional below
}

# This condition will be only evaluated when we parse the file
# the second time. (because of the "next" statement above)

# When the line number is greater or equal than "ln" print it.
# (print is the default action)
FNR>=ln
相关问题