awk разделить строку на запятые игнорировать, если внутри двойных кавычек - PullRequest
0 голосов
/ 07 февраля 2020

Я знаю, это может звучать так, что есть 2000 ответов на этот вопрос в Интернете, но я не нашел ни одного для этого конкретного случая c (например, -vFPAT этого и других ответов ), потому что мне нужно быть с split. Я должен разделить файл CSV с awk, в котором могут быть некоторые значения в двойных кавычках. Мне нужно указать функции split игнорировать ,, если она внутри "", чтобы получить массив элементов.

Вот что я пробовал на основе других ответов как пример

cat try.txt

Hi,I,"am,your",father
maybe,you,knew,it
but,"I,wanted",to,"be,sure"


cat tst.awk

BEGIN {}
{
    n_a = split($0,a,/([^,]*)|("[^"]+")/);
    for (i=1; i<=n_a; i++) {
        collecter[NR][i]=a[i];
    }
}
END {
    for (i=1; i<=length(collecter); i++)
    {
        for (z=1; z<=length(collecter[i]);z++)
        {
            printf "%s\n", collecter[i][z];
        }
    }
}

но не повезло:

awk -f tst.awk try.txt 

,
,
,


,
,
,


,
,
,

Я попробовал другое выражение регулярного выражения, основанное на другом аналогичном ответе, но ни один из них не подходит для этого конкретного случая.

Обратите внимание: поля в двойных кавычках mat и могут отсутствовать, могут быть более одного и без фиксированной позиции / длины!

Заранее благодарим за любую помощь!

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

GNU AWK имеет функцию под названием patsplit, которая позволяет вам делать разбиение с использованием шаблона FPAT:

$ awk '{ print "RECORD " NR ":"; n=patsplit($0, a, "([^,]*)|(\"[^\"]+\")"); for (i=1;i<=n;++i) {print i, "|" a[i] "|"}}' file
RECORD 1:
1 |Hi|
2 |I|
3 |"am,your"|
4 |father|
RECORD 2:
1 |maybe|
2 |you|
3 |knew|
4 |it|
RECORD 3:
1 |but|
2 |"I,wanted"|
3 |to|
4 |"be,sure"|
1 голос
/ 07 февраля 2020

Если Python является альтернативой, вот решение:

try.txt:

Hi,I,"am,your",father
maybe,you,knew,it
but,"I,wanted",to,"be,sure"

Python фрагмент:

import csv

with open('try.txt') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_ALL)
    for row in reader:
        print(row)

Приведенный выше фрагмент кода приведет к:

['Hi', 'I', 'am,your', 'father']
['maybe', 'you', 'knew', 'it']
['but', 'I,wanted', 'to', 'be,sure']
...