【问题标题】:Select current and previous line if certain value is found如果找到某个值,则选择当前行和上一行
【发布时间】:2019-02-12 03:51:40
【问题描述】:

为了找出我的问题,我减去第 3 列并使用新值创建一个新的第 5 列,然后如果在第 5 列中找到的值等于 25,则打印上一行和当前行。

输入文件

1   1   35  1
2   5   50  1
2   6   75  1
4   7   85  1
5   8   100 1
6   9   125 1
4   1   200 1

我试过了

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

输出

1 1 35 1 35
2 5 50 1 15
2 6 75 1 25
4 7 85 1 10
5 8 100 1 15
6 9 125 1 25
4 1 200 1 75

期望的输出

2 5 50 1 15
2 6 75 1 25
5 8 100 1 15
6 9 125 1 25

提前致谢

【问题讨论】:

    标签: awk


    【解决方案1】:

    你快到了,除了之前的 3 美元,保留之前的 0 美元,仅在满足条件时打印。

    $ awk '{$5=$3-p3} $5==25{print p0; print} {p0=$0;p3=$3}' file
    
    2 5 50 1 15
    2 6 75 1 25
    5 8 100 1 15
    6 9 125 1 25
    

    这可以进一步打高尔夫球

    $ awk '25==($5=$3-p3){print p0; print} {p0=$0;p3=$3}' file
    

    检查新计算的字段$5是否等于25。如果是则打印上一行和当前行。保存上一行和之前的 $3 用于下一行的计算。

    【讨论】:

    • 打高尔夫球 ++.
    • 嗨,Karakfa,谢谢代码,你能解释一下代码是如何工作的
    【解决方案2】:

    您已经接近答案了,只需通过另一个 awk 管道将其打印出来

    awk '{$5 = $3 - prev3; prev3 = $3; print $0}' oxxo.txt  | awk  ' { curr=$0; if($5==25) { print prev;print curr } prev=curr } '
    

    带输入:

    $ cat oxxo.txt
    1   1   35  1
    2   5   50  1
    2   6   75  1
    4   7   85  1
    5   8   100 1
    6   9   125 1
    4   1   200 1
    
    $ awk '{$5 = $3 - prev3; prev3 = $3; print $0}' oxxo.txt  | awk  ' { curr=$0; if($5==25) { print prev;print curr } prev=curr } '
    2 5 50 1 15
    2 6 75 1 25
    5 8 100 1 15
    6 9 125 1 25
    
    $
    

    【讨论】:

      【解决方案3】:

      请您尝试关注一下。

      awk '$3-prev==25{print line ORS $0,$3} {$(NF+1)=$3-prev;prev=$3;line=$0}' Input_file | column -t
      

      【讨论】:

        【解决方案4】:

        这是一个:

        $ awk '{$5=$3-q;t=p;p=$0;q=$3;$0=t ORS $0}$10==25' file
        2 5 50 1 15
        2 6 75 1 25
        5 8 100 1 15
        6 9 125 1 25
        

        解释:

        $ awk '{
            $5=$3-q      # subtract
            t=p          # previous to temp
            p=$0         # store previous for next round
            q=$3         # store subtract value for next round
            $0=t ORS $0  # prepare record for output
        }
        $10==25          # output if equals
        ' file
        

        不检查重复项,因此您可能会打印两次相同的记录。最简单的修复方法是将输出通过管道传输到uniq

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-09
          • 2020-05-03
          • 2016-01-17
          • 1970-01-01
          • 2021-12-01
          • 1970-01-01
          • 2021-02-06
          • 1970-01-01
          相关资源
          最近更新 更多