Você pode especificar um gabinete para corte? [duplicado]

3

Eu posso usar cut para extrair colunas de um arquivo:

$ cat foo
foo,bar,hello
bash,baz,world

$ cut -d\, -f2 foo
bar
baz

Mas e se uma coluna tiver um delimitador seguro dentro de um gabinete como esse?

$ cat foo
foo,"hello, world",bar
bash,goodbye,baz

$ cut -d\, -f2 temp12
"hello
goodbye

Existe alguma maneira de dizer ao cut para respeitar o fechamento da cota "" caracteres?

    
por Cory Klein 27.11.2012 / 00:31

2 respostas

1

cut poderia fazer isso se você pré-processar sua entrada para escapar dos caracteres dentro das aspas (por exemplo, substituir "_" por "_u" e "," por "_c" entre aspas ou substituir todos os caracteres por sua notação hexadecimal de 2 bytes) e pós-processá-lo para restaurar esse escape.

Algo como:

perl -pe 's/"(.*?)"/"\"".unpack("H*", $1)."\""/ge' |
  cut -d, -f2 |
  perl -pe 's/"(.*?)"/"\"".pack("H*",$1)."\""/ge'

(assumindo que não há citações com escape dentro (ou fora) das aspas).

Mas, dado o esforço que seria necessário, você poderia também usar um analisador csv adequado ou fazer tudo com um mecanismo de expressão regular semelhante a um perl.

    
por 27.11.2012 / 16:01
3

Definitivamente não é para o corte GNU, pelo menos:

/* The delimeter character for field mode. */ static unsigned char delim;

(como visto na fonte GNU coreutils)

    
por 27.11.2012 / 15:36

Tags