Awk 如果找到特定值,则选择当前和上一行

Awk 如果找到特定值,则选择当前和上一行,awk,Awk,为了解决我的问题,我减去第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

为了解决我的问题,我减去第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 '{$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

如果您已接近答案,只需通过管道将其传输到另一个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,保留以前的$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,以便在下一行进行计算

你能试试下面的吗

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

嗨,Karakfa,关于代码,你能解释一下代码是如何工作的吗