多个输入文件awk命令行

时间:2015-10-18 20:34:15

标签: awk

我是一个awk新手,并且无可否认地不了解FNR NR如何驱动循环文件。我能够获得两个输入文件。我需要添加另一个(inputFile3)。

我是从命令行运行的:

awk -f parseField.awk inputFile1.csv inputFile2.csv ./inputFile3.TXT

目前,我使用:

循环使用inputFile3
FNR!=NR {...}

我使用:

循环使用inputFile1
FNR==NR {...}

我需要在mix(inputFile2)中添加另一个文件。我可以在我的awk脚本(parseField)中使用什么语法来访问第三个输入文件?

2 个答案:

答案 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 awkthanks 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的解决方案投票: - )