带变量的AWK NR查找提供额外的输出

带变量的AWK NR查找提供额外的输出,awk,records,Awk,Records,我有两个文件。其中一个变量是字段1。我用它在另一个文件中查找一个值,该文件将变量作为记录,后面是另一个包含我想要的信息的记录。我查1找A,查3找C 1 A 2 B 3 C 我应该能够得到这个很容易与awk使用以下行 awk '{if ($1=="3") A=NR}{ if (NR==(A+1)) print $0}' FILEIN 输出应该是 C 相反,我得到的输出是第一行,然后是正确的值。即 1 C 如果我只是输入NR值,而不是分配一个变量,它只会给我想要的数据。如果我加上(A+2),

我有两个文件。其中一个变量是字段1。我用它在另一个文件中查找一个值,该文件将变量作为记录,后面是另一个包含我想要的信息的记录。我查1找A,查3找C

1
A
2
B
3
C
我应该能够得到这个很容易与awk使用以下行

awk '{if ($1=="3") A=NR}{ if (NR==(A+1)) print $0}' FILEIN
输出应该是

C
相反,我得到的输出是第一行,然后是正确的值。即

1
C

如果我只是输入NR值,而不是分配一个变量,它只会给我想要的数据。如果我加上(A+2),它会给我第2行和我想要的那一行,依此类推。任何关于为什么会发生这种情况的想法

正如Header评论的那样,在开始时
A
没有赋值,awk将取
0
,因此
0+1,0+2
。。。你明白为什么你会收到意想不到的电话了

如果我正确理解您的需求,您不必为了您的需求而使用
NR

试试这句话:

awk '$1=="3"{getline;print;exit}' file
用您的示例进行测试:

kent$  echo "1
A
2
B
3
C"|awk '$1=="3"{getline;print;exit}'
C
如果您只是想解决代码中的问题,可以添加一个
&&a
,如:

awk '{if ($1=="3") A=NR}{ if (NR==(A+1)&&A) print $0}'
您的线路可以缩短为:

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

不要忘记,即使在脚本开始时,
A=0
,因此
NR==(A+1)
仍将计算为
NR==1
。祝你好运。我不太明白&&A是如何工作的。然而,您的第一个代码非常好,因为它一找到行就完成了。它比我的代码的固定版本运行得快得多。谢谢大家!@user2348290它应该更快,因为在找到正确的行之后,它停止了进一步的处理。但是,如果您有许多带有
3
的行,则该行将只接受第一种情况。我不知道这对你是否合适。你的问题中没有提到这一点每一条线都是独一无二的,所以你在不知情的情况下给了我最好的答案,省去了通过40米线看的awk。