Ich habe eine Datei wie diese:

a, b, c, "hallo, hi", d

Ich möchte, dass das Feldtrennzeichen kein Leerzeichen, kein Komma und kein Leerzeichen ist. Derzeit habe ich

Katzendatei | awk 'BEGIN {FS = "[^], [^]"}; {print $ 4} '

Was "Hallo, hallo" geben sollte, aber es gibt nichts zurück. Ich bin ziemlich neu in dieser Sache mit regulären Ausdrücken, daher wäre jede Hilfe dankbar.

0
LTM 18 Apr. 2018 im 07:38

4 Antworten

Beste Antwort

Eh, nein, es sollte nicht hello, hi geben. Was tatsächlich passiert ist:

 a,b,c,"hello, hi",d
|| ||| ||       ||_|Third fied separator
|| ||| ||_______|
|| ||| |   $3
|| |||_|
|| || Second field separator
|| ||
|| |+- $2 is a comma
||_|
| First field separator
|
+- $0 is empty

Nach dem dritten Feldtrennzeichen ist die Zeile also leer. Sie können dieses Verhalten mit überprüfen

aaa,baa,caa,"hello, hi",daa

Als Eingabedatei.

2
Ljm Dullaart 18 Apr. 2018 im 05:58

Wenn Sie regelmäßig mit CSV-Dateien arbeiten und das csvtool installieren möchten, können Sie einfach sagen:

echo 'a,b,c,"hello, hi",d' | csvtool col 4 -

Und es wird ausspucken

"hello, hi"
1
chw21 18 Apr. 2018 im 06:05

Sie können auch sed verwenden:

>sed 's/.*\("[^"]*"\).*/\1/' <<< 'a,b,c,"hello, hi",d'
"hello, hi"

Oder grep:

>grep -o '"[^"]*"' <<< 'a,b,c,"hello, hi",d'
"hello, hi"
1
sergio 18 Apr. 2018 im 06:16

Die Lösung besteht darin, den Feldinhalt anstelle des Feldtrennzeichens zu definieren. Sie müssen gawk verwenden, da Standard awk diese Funktion nicht nativ bietet. (unter Linux awk = gawk)

echo 'a,b,c,"hello, hi",d' \
 | awk '
     # define the content with FPAT
     # here any non , or a encapsulate quoted content
     BEGIN{ FPAT = "[^,]*|\"[^\"]*\"" }

     # for showing each field
     {for (i=1;i<=NF;i++) printf( "field %d: %s\n", i, $i)}
     '

field 1: a
field 2: b
field 3: c
field 4: "hello, hi"
field 5: d

Standardmäßig versucht der Regex-Abgleich, immer so lange wie möglich zu dauern, sodass ein ".., ..." länger ist als ".. und / oder ...", wobei eine vollständige Zeichenfolge in Anführungszeichen anstelle eines teilweise durch Koma getrennten Inhalts derselben Zeichenfolge verwendet wird

1
NeronLeVelu 20 Apr. 2018 im 05:31