2

У меня много больших файлов данных. Разделителем между полями является точка с запятой. Однако я обнаружил, что в некоторых полях есть точки с запятой, поэтому я не могу просто использовать точку с запятой в качестве разделителя полей.

В следующем примере есть 4 поля, но awk видит только 3, потому что '1' в поле 3 удаляется регулярным выражением (которое включает '-', потому что некоторые числовые данные являются отрицательными):

echo '"This";"is";1;"line of; data"' | awk -F'[0-9"-];[0-9"-]' '{print "No. of fields:\t"NF; print "Field 3:\t" $3}'
No. of fields:  3
Field 3:        ;"line of; data"

Конечно,

echo '"This";"is";1;"line of; data"' | awk -F';' '{print "No. of fields:\t"NF}'
No. of fields:  5

решает эту проблему, но считает последнее поле как два отдельных поля.

Кто-нибудь знает решение этой проблемы?

Спасибо!

Matthijs

1 ответ1

2

Вам нужно будет использовать GNU awk и FPAT:

awk 'BEGIN { FPAT = "([^;]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }'

Тестирование:

echo '"This";"is";1;"line of; data"' | awk 'BEGIN { FPAT = "([^;]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }'

Результаты:

"This"
"is"
1
"line of; data"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .