OXXO
OXXO

Reputation: 724

Select current and previous line if certain value is found

To figure out my problem, I subtract column 3 and create a new column 5 with new values, then I print the previous and current line if the value found is equal to 25 in column 5.

Input file

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

I tried

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

output

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

Desired Output

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

Thanks in advance

Upvotes: 0

Views: 82

Answers (4)

karakfa
karakfa

Reputation: 67567

you're almost there, in addition to previous $3, keep the previous $0 and only print when condition is satisfied.

$ 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

this can be further golfed to

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

check the newly computed field $5 whether equal to 25. If so print the previous line and current line. Save the previous line and previous $3 for the computations in the next line.

Upvotes: 3

James Brown
James Brown

Reputation: 37464

Here's one:

$ 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

Explained:

$ 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

No checking for duplicates so you might get same record printed twice. Easiest way to fix is to pipe the output to uniq.

Upvotes: 1

RavinderSingh13
RavinderSingh13

Reputation: 133760

Could you please try following.

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

Upvotes: 1

stack0114106
stack0114106

Reputation: 8791

You are close to the answer, just pipe it another awk and print it

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

with Inputs:

$ 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

$

Upvotes: 1

Related Questions