要弄清楚我的问题,我减去第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
预先感谢
答案 0 :(得分:3)
除了前面的$ 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,以便在下一行中进行计算。
答案 1 :(得分:1)
这里是一个:
$ 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
。
答案 2 :(得分:1)
您已接近答案,只需将其传给另一个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 :(得分:1)
请您尝试以下。
awk '$3-prev==25{print line ORS $0,$3} {$(NF+1)=$3-prev;prev=$3;line=$0}' Input_file | column -t