Awk:如果NR在数组中,则打印字段

Awk:如果NR在数组中,则打印字段,awk,Awk,有一个包含单列数字的文件: 12 15 24 220 第二个文件有很多字段。我试着做一件非常简单的事情:打印大文件的第1列,打印第一个文件中列出数字的所有行(第12行、第15行等) 我想出了一句话: awk 'FNR==NR{array[NR]=$1;next}(NR in array){print $1}' lines.txt input.txt > output.txt 但它给了我一个空的输出文件,我不知道为什么,不介意一些帮助。 我猜是“数组中的NR”没有我预期的效果。您必须使

有一个包含单列数字的文件:

12
15
24
220
第二个文件有很多字段。我试着做一件非常简单的事情:打印大文件的第1列,打印第一个文件中列出数字的所有行(第12行、第15行等)

我想出了一句话:

awk 'FNR==NR{array[NR]=$1;next}(NR in array){print $1}' lines.txt input.txt  > output.txt
但它给了我一个空的输出文件,我不知道为什么,不介意一些帮助。
我猜是“数组中的NR”没有我预期的效果。

您必须使用
FNR-in-array
,因为
FNR
是当前文件中的行号,并且不计算在lines.txt中已经读取的所有行。

NR
是总的输入行号。在第二个文件中,
NR
从第一个文件的最后一行号加上一开始,然后从那里增加。第二个条件永远不会匹配

我猜你是在找这样的东西:

awk 'FNR==NR{array[$1]=1;next}
    (FNR in array){print $1}' lines.txt input.txt  > output.txt
显然,
FNR
是当前文件中的行号


还要注意,我们正在将第一个文件中的数字读取到数组中,而不是第一个文件中的行号。

谢谢!使用NR而不是FNR是我明显的错误。但是为什么要使用数组[$1]=$1呢?第一个$1是索引,第二个$1是值。我不明白为什么索引在这里很重要?这是因为在数组[NR]=$1的情况下,索引总是等于行数,即是一个常数吗;键为
$1
,值为常量1。价值不重要;我们只关心键是我们想要的数字,因为这是数组中FNR检查的内容。关联数组很好,因为您可以在不进行搜索的情况下找到键是否存在。