AWK - понимание различных результатов, полученных с использованием FILENAME и OFS - PullRequest
1 голос
/ 10 апреля 2019

Входной файл 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 <== </p>

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 <== </p>

,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 <== </p>

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: Я использую GNU Awk 3.1.7 в Oracle Linux Server версии 6.10. Ожидаемый результат такой, как он показан в my_report_1.csv и my_report_3.csv

1 Ответ

2 голосов
/ 10 апреля 2019

Разница в том, что вы изменяете нумерацию аргументов, указывая 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...