2016-04-09 17 views
1

Ich glaube nicht, gibt es eine Möglichkeit, diesen Befehl das Komma in Anführungszeichen zu ignorieren (zwischen den Dreien)?Trennzeichen in Bash ignorieren Trennzeichen in Anführungszeichen

$ echo 'one,two,"three,three",four' | { IFS=',' read -a array; echo ${#array[@]}; } 
5 

Nb. echo ${#array[@]} Berichte Feldlänge ..

+2

Sie versuchen im Wesentlichen, ein CSV-Format mit der Shell zu analysieren. Kurz gesagt, GNU awk kann es tun, aber nur einen CSV-Parser in einer Skriptsprache verwenden, z. Perl, Python oder Rubin. –

+0

Ja Rscript kann es tun: 'Rscript -e" Drucken (Länge (scan (text = '$ (Echo' eins, zwei, "drei, drei \", vier ')', was = 'Zeichen', sep = ',', quiet = T))) '' – geotheory

Antwort

2

Mit FPAT in Gnu-awk können Sie es tun:

str='one,two,"three,three",four' 

awk -v FPAT='"[^"]*"|[^,]*' '{ 
    print "# of columns: " NF; for(i=1; i<=NF; i++) print "Field #", i, ":", $i 
}' <<< "$str" 

Ausgang :

# of columns: 4 
Field # 1 : one 
Field # 2 : two 
Field # 3 : "three,three" 
Field # 4 : four 
+1

Nice entkommen. Ich habe noch nicht über 'FPAT' gesprochen. –

+1

OK, ich kann dir das Häkchen nicht vorenthalten! – geotheory

1

das Komma entkommen:

echo 'one,two,"three\,three",four' 

Ergebnis:

$ echo 'one,two,"three\,three",four' | { IFS=',' read -a array; echo ${#array[@]} ${array[2]}; } 
4 "three,three" 
+0

Leider kann ich nicht das Komma – geotheory