Невозможно проанализировать CSV с пустым полем в начале в gawk - PullRequest
1 голос
/ 31 октября 2019

Я создал gawk (GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)) script1. здесь


input.csv:

,b,c,d,e,f
g,h,i,j,k,l

script1:

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{print $1,$2,$3,$4,$5,$6}' input.csv

выход script1:
Все выходные данные script1 пусты!

,,,,,
g,h,i,j,k,l

Я создал script2, чтобы убедиться, что поле анализируется. здесь

script2:

gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{for (i=1; i<=NF; i++) printf "field #%d: %s\n", i, $(i)}' input.csv

выход script2:
поле # 1 пустое, поэтому я подтвердил, что оно было правильно проанализировано.

field #1: 
field #2: b
field #3: c
field #4: d
field #5: e
field #6: f
field #1: g
field #2: h
field #3: i
field #4: j
field #5: k
field #6: l

Почему мой скрипт1 не может проанализировать CSV с пустым полем в начале в gawk?
искренне

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Это ошибка, о которой теперь сообщают разработчики GNU awk (см. https://lists.gnu.org/archive/html/bug-gawk/2019-10/msg00041.html), и тем временем вы можете обойти ее следующим образом:

$ gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} {print $1,$2,$3,$4,$5,$6}' input.csv
,b,c,d,e,f
g,h,i,j,k,l

Вот упрощенная версия проблемы (на основена более ранних работах @ karakfa ):

$ echo ',b' | gawk -v FPAT='[^,]*' '{print $2}'
b
$ echo ',b' | gawk -v FPAT='[^,]*' '{print $1, $2}'

$

Это можно обойти так же, как и в предыдущей ошибке (https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html):

$ echo ',b' | gawk -v FPAT='[^,]*' '{oFPAT=FPAT; FPAT=""; FPAT=oFPAT; print $1, $2}'
 b
$

Видимо этоможно также обойти просто доступ к NF, например:

$ echo ',b' | gawk -v FPAT='[^,]*' '{NF; print $1, $2}'
 b
$
2 голосов
/ 31 октября 2019

Не ответ, но слишком долго для комментариев.

Это кажется странным поведением. Более простой тестовый пример

Это прекрасно работает

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $1 "$"}'
$

Это тоже

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $2 "$"}'
b$

Но не это

$ echo ',b' | gawk -v FPAT='[^,"]*' -v OFS=_ '{print $1,$2 "$"}'
_$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...