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。
改用这个:
awk -F, '{print FNR}' file1 file2
Run Code Online (Sandbox Code Playgroud)
FNR
awk 中的变量给出了每个输入文件的记录数。但是,当您使用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
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 从中读取。