Além de como cortar e reorganizar os campos (abordados nas outras respostas), há a questão dos campos CSV peculiares.
Se seus dados se enquadram nessa categoria "peculiar", um pouco da filtragem pré e postagem pode cuidar disso. Os filtros mostrados abaixo exigem que os caracteres \x01
, \x02
, \x03
, \x04
não apareçam em nenhum lugar dos seus dados.
Aqui estão os filtros agrupados em torno de um simples dump de campo awk
.
Observação: campo-cinco tem um layout "campo entre aspas" inválido / incompleto, mas é benigno no final de uma linha (dependendo do analisador de CSV) . Mas, é claro, isso causaria resultados inesperados problemáticos se fosse para ser trocado de sua posição atual fim de linha .
Atualização; user121196 apontou um bug quando uma vírgula precede uma citação à direita. Aqui está a correção.
Os dados
cat <<'EOF' >file
field one,"fie,ld,two",field"three","field,\",four","field,five
"15111 N. Hayden Rd., Ste 160,",""
EOF
O código
sed -r 's/^/,/; s/\"/\x01/g; s/,"([^"]*)"/,\x02\x03/g; s/,"/,\x02/; :MC; s/\x02([^\x03]*),([^\x03]*)/\x02\x04/g; tMC; s/^,// ' file |
awk -F, '{ for(i=1; i<=NF; i++) printf "%s\n", $i; print NL}' |
sed -r 's/\x01/\"/g; s/(\x02|\x03)/"/g; s/\x04/,/g'
A saída:
field one
"fie,ld,two"
field"three"
"field,\",four"
"field,five
"15111 N. Hayden Rd., Ste 160,"
""
Aqui está o pré filtro , expandido com comentários.
O filtro de postagens é apenas uma reversão de \x01
. \x02
, \x03
, \x04
sed -r '
s/^/,/ # add a leading comma delimiter
s/\"/\x01/g # obfuscate escaped quotation-mark (\")
s/,"([^"]*)"/,\x02\x03/g # obfuscate quotation-marks
s/,"/,\x02/ # when no trailing quote on last field
:MC # obfuscate commas embedded in quotes
s/\x02([^\x03]*),([^\x03]*)/\x02\x04/g
tMC
s/^,// # remove spurious leading delimiter
'