我是一个awk新手,并且无可否认地不了解FNR NR如何驱动循环文件。我能够获得两个输入文件。我需要添加另一个(inputFile3)。
我是从命令行运行的:
awk -f parseField.awk inputFile1.csv inputFile2.csv ./inputFile3.TXT
目前,我使用:
循环使用inputFile3FNR!=NR {...}
我使用:
循环使用inputFile1FNR==NR {...}
我需要在mix(inputFile2)中添加另一个文件。我可以在我的awk脚本(parseField)中使用什么语法来访问第三个输入文件?
答案 0 :(得分:4)
要添加@EtanReisner的好信息,您可以保留一个计数器:FNR==1 {file_number++}
。只要读取文件的第一行,这将增加计数器。
总之,你可以说:
#!/bin/awk -f
BEGIN {print "start program"}
NR==1 {print "reading first file"}
FNR==1 {filenum++; print "I am in file number", filenum}
{ ... }
如果你在 GNU POSIX awk(thanks Jonathan Leffler),你也可以使用FILENAME
变量。或者ARGC
变量和ARGV
数组。
另请参阅Idiomatic awk中的相关信息:
awk中经常使用的另一个构造如下:
$ awk 'NR == FNR { # some actions; next} # other condition {# other actions}' file1.txt file2.txt
处理两个文件时使用。处理多个时 文件,awk依次读取每个文件,一个接一个,在 命令它们在命令行中指定。特殊变量NR 存储到目前为止读取的输入记录总数,不管是什么 已读取了多少个文件。 NR的值始终为1 增加直到程序终止。另一个变量FNR存储 从正在处理的当前文件中读取的记录数。该 FNR的值从1开始,一直增加到当前文件的末尾 到达,然后一旦第一行再次设置为1 读取下一个文件,依此类推。因此,条件NR == FNR仅为真 而awk正在读取第一个文件。
答案 1 :(得分:0)
不像POSIX FILENAME解决方案那么优雅,但对于缺少太多功能的尘土飞扬的旧awk
来说非常方便。您可以在以几种方式将数据发送到awk
之前制作一个处理数据的复合语句...
选项1
首先,您可以在发送到awk
的每个文件之前自行输出文件编号。所以,如果你的文件是这样的:
<强>文件1 强>
Line 1 of 1
<强> file2的强>
Line 1 of 2
Line 2 of 2
<强> file3的强>
Line 1 of 3
Line 2 of 3
Line 3 of 3
你可以这样做:
{ echo 1; cat file1; echo 2; cat file2; echo 3; cat file3; }
1
Line 1 of 1
2
Line 1 of 2
Line 2 of 2
3
Line 1 of 3
Line 2 of 3
Line 3 of 3
并将其导入awk
,然后每次字段数为1时选取文件编号
{ echo 1; cat file1; echo 2; cat file2; echo 3; cat file3; } | awk 'NF==1{file=$1;next} {print file,$0}'
1 Line 1 of 1
2 Line 1 of 2
2 Line 2 of 2
3 Line 1 of 3
3 Line 2 of 3
3 Line 3 of 3
选项2
或者,您可以将文件编号编辑到每行的开头或结尾,以便$1
内的awk
可用,如下所示:
{ sed 's/^/1 /' file1; sed 's/^/2 /' file2; sed 's/^/3 /' file3; }
1 Line 1 of 1
2 Line 1 of 2
2 Line 2 of 2
3 Line 1 of 3
3 Line 2 of 3
3 Line 3 of 3
所以,现在你可以做到
{ sed 's/^/1 /' file1; sed 's/^/2 /' file2; sed 's/^/3 /' file3; } | awk '{file=$1; ...}'
我仍在为@ fedorqui的解决方案投票: - )