Question

I have two files. One has a variable as field 1. I am using this to look up a value in another file which has the variable as a record, followed by another record containing the information I want. ie I am looking up 1 to find A or 3 to find C.

1
A
2
B
3
C

I should be able to get this easily with awk using the following line.

awk '{if ($1=="3") A=NR}{ if (NR==(A+1)) print $0}' FILEIN

output should be

C

instead I am getting an output with the first line, then the correct value. ie

1
C

If I just put in the NR value rather than assigning a variable it gives me only the data I want. If I put (A+2) it gives me line 2 and the line I want, so on and so on. Any ideas as to why this is happening

Was it helpful?

Solution

as shelter commented, at beginning the A wasn't assigned by a value, awk will take 0, so 0+1, 0+2... you see why you got the unexpected line.

you don't have to play with NR for your needs, if I understood your requirement right.

try this line:

awk '$1=="3"{getline;print;exit}' file

test with your example:

kent$  echo "1
A
2
B
3
C"|awk '$1=="3"{getline;print;exit}'
C

If you just want to fix the problem in your code, you add a &&A, like:

awk '{if ($1=="3") A=NR}{ if (NR==(A+1)&&A) print $0}'

and your line could be shorten as:

awk '$1=="3"{A=NR}NR==(A+1)&&A'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top