FNR 和 NR 变量问题

FNR 和 NR 变量问题

我有两个文件,其中一个有 10 条记录,另一个有 15 条记录,问题是当我cat将它们放在一起时,总是FNR=NR

例如,考虑以下文件:

文件1:

1,boo
2,foo
3,boo

文件2:

1,boo
2,foo
3,boo
4,foo

当应用以下代码时:

cat File1 File2 | awk -F, '{print FNR}'

结果应该是:

1
2
3
1
2 
3
4

但我实际上拥有的是FNR= 1 到 7。

答案1

使用这个代替:

awk -F, '{print FNR}' file1 file2

awk 中的变量FNR给出每个输入文件的记录数。但是,当您使用cat .. | awkawk 读取 stdin 文件描述符时,awk 只能看到 1 个“文件”。

尝试这样做以更好地理解(FILENAME包含当前正在处理的文件):

$ awk -F, '{print FILENAME" "FNR}' file1 file2
file1 1
file1 2
file1 3
file2 1
file2 2
file2 3
file2 4
$ cat file1 file2 | awk -F, '{print FILENAME" "FNR}'
- 1
- 2
- 3
- 4
- 5
- 6
- 7

正如您在第一个示例中看到的,有 2 个文件正在处理,在第二个示例中是FILENAME-表示标准输入。

编辑:请参阅以下示例:

$ cat file1 | awk -F, '{print FILENAME" "FNR}' - file1 <(cat file1)
- 1
- 2
- 3
file1 1
file1 2
file1 3
/dev/fd/63 1
/dev/fd/63 2
/dev/fd/63 3

首先,awk 从 stdin 读取(该cat file1部分,也作为 awk 的参数-)。然后是常规的file1.最后是<(cat file1)创建管道 ( /dev/fd/63) 的部分,awk 从这里读取。

答案2

您将cat它们连接 ( ) 在一起,因此awk它只是一个文件(在本例中是标准输入)。如果您想获得所需的结果,请改为运行

 awk -F, '{print FNR}' File1 File2

答案3

这是不正确的。当您捕获文件并将它们发送到管道时,它不再单独计算文件,而是将管道中的所有输入作为单个文件获取。

相关内容