我有两个文件,其中一个有 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 .. | awk
awk 读取 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
这是不正确的。当您捕获文件并将它们发送到管道时,它不再单独计算文件,而是将管道中的所有输入作为单个文件获取。