FNR 和 NR 变量问题

Eng*_*ng7 2 awk text-processing files

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

例如,考虑以下文件:

文件1:

1,boo
2,foo
3,boo
Run Code Online (Sandbox Code Playgroud)

文件2:

1,boo
2,foo
3,boo
4,foo
Run Code Online (Sandbox Code Playgroud)

应用以下代码时:

cat File1 File2 | awk -F, '{print FNR}'
Run Code Online (Sandbox Code Playgroud)

结果应该是:

1
2
3
1
2 
3
4
Run Code Online (Sandbox Code Playgroud)

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

cha*_*aos 6

改用这个:

awk -F, '{print FNR}' file1 file2
Run Code Online (Sandbox Code Playgroud)

FNRawk 中的变量给出了每个输入文件的记录数。但是,当您使用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
Run Code Online (Sandbox Code Playgroud)

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

编辑:请参阅以下示例:

$ 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
Run Code Online (Sandbox Code Playgroud)

首先,awk 从标准输入(该cat file1部分,也作为-awk的参数)读取。然后是正规的file1。最后是<(cat file1)创建管道 ( /dev/fd/63)的部分,awk 从中读取。