AWK-了解使用FILENAME和OFS获得的不同输出

时间:2019-04-10 16:07:03

标签: awk

输入文件1:clnd.csv

20180805,08/05/2018,w27_2018,WK27 2018,m07_2018,AUG 2018,q03_2018,Q03 2018,h02_2018,H02 2018,a2018,FY2018,27,WEEK 27,01,SUNDAY
20180812,08/12/2018,w28_2018,WK28 2018,m07_2018,AUG 2018,q03_2018,Q03 2018,h02_2018,H02 2018,a2018,FY2018,28,WEEK 28,01,SUNDAY
20180819,08/19/2018,w29_2018,WK29 2018,m07_2018,AUG 2018,q03_2018,Q03 2018,h02_2018,H02 2018,a2018,FY2018,29,WEEK 29,01,SUNDAY
20180826,08/26/2018,w30_2018,WK30 2018,m07_2018,AUG 2018,q03_2018,Q03 2018,h02_2018,H02 2018,a2018,FY2018,30,WEEK 30,01,SUNDAY

输入文件2:data.csv

w27_2018,257,1,26.20,0.00,24.26
w28_2018,257,1,7.97,0.00,24.26
w29_2018,257,1,34.86,0.00,24.26
w30_2018,257,1,3.29,0.00,24.26

使用的GNU-Awk命令:

awk -F, 'NR==FNR {y=substr($12,3,4); a[ARGV[2],$3]=y FS $3 FS $4; next} {$1=a[ARGV[2],$1]; } 1' OFS=, clnd.csv data.csv  >> my_report_1.csv
awk -F, 'NR==FNR {y=substr($12,3,4); a[ARGV[2],$3]=y FS $3 FS $4; next} {$1=a[FILENAME,$1]; } 1' OFS=, clnd.csv data.csv  >> my_report_2.csv
awk -F, -v OFS=, 'NR==FNR {y=substr($12,3,4); a[ARGV[2],$3]=y FS $3 FS $4; next} {$1=a[FILENAME,$1]; } 1' clnd.csv data.csv  >> my_report_3.csv

获得的输出:cat my_report _ ?. csv

==> my_report_1.csv <==

2018,w27_2018,WK27 2018,257,1,26.20,0.00,24.26
2018,w28_2018,WK28 2018,257,1,7.97,0.00,24.26
2018,w29_2018,WK29 2018,257,1,34.86,0.00,24.26
2018,w30_2018,WK30 2018,257,1,3.29,0.00,24.26

==> my_report_2.csv <==

,257,1,26.20,0.00,24.26
,257,1,7.97,0.00,24.26
,257,1,34.86,0.00,24.26
,257,1,3.29,0.00,24.26

==> my_report_3.csv <==

2018,w27_2018,WK27 2018,257,1,26.20,0.00,24.26
2018,w28_2018,WK28 2018,257,1,7.97,0.00,24.26
2018,w29_2018,WK29 2018,257,1,34.86,0.00,24.26
2018,w30_2018,WK30 2018,257,1,3.29,0.00,24.26

能否请您解释为什么这些输出不同?我的理解是FILENAME将保存正在读取的文件的名称,并且像我所做的那样,在开头和结尾分别设置OFS不应有任何区别,因为在读取任何记录之前应该以任何一种方式对其进行设置。提前致谢!

P.S:我在Oracle Linux Server版本6.10上使用GNU Awk 3.1.7。预期输出与my_report_1.csv和my_report_3.csv中显示的一样

1 个答案:

答案 0 :(得分:2)

区别在于,通过将OFS指定为awk的尾随参数而不是使用-v选项来更改参数的编号。

在第二个示例中,这尤其是一个问题,因为在处理第二个文件时,您依赖于argv[2]FILENAME具有相同值的事实。

您可以在这里看到区别:

$ gawk -v OFS=, -f a.awk a b
    ARGV[0] = gawk
    ARGV[1] = a
    ARGV[2] = b

$ gawk -f a.awk OFS=, a b
    ARGV[0] = gawk
    ARGV[1] = OFS=,
    ARGV[2] = a
    ARGV[3] = b