输入文件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中显示的一样
答案 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