Existe uma linha de comando para soltar uma coluna em um arquivo CSV?

32

Ter um arquivo com o seguinte conteúdo:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

Eu procuro obter um arquivo igual ao original, mas faltando uma coluna n-ésima para n = 2 (ou pode ser 3)

1111,2222,4444
aaaa,bbbb,dddd

ou, para n = 0 (ou pode ser 1)

2222,3333,4444
bbbb,cccc,dddd

Um arquivo real pode ter gigabytes com dezenas de milhares de colunas.

Como sempre, nesses casos, suspeito que os magos da linha de comando podem oferecer uma solução elegante ...: -)

No meu caso real eu preciso soltar 2 primeiras colunas, o que pode ser feito soltando uma primeira coluna duas vezes em uma sequência, mas suponho que seria mais interessante generalizar um pouco.

    
por Ivan 21.03.2012 / 05:27

2 respostas

46

Eu acredito que isso é específico para cortar dos coreutils GNU:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

Normalmente, você especifica os campos que deseja através de -f, mas adicionando --complementar, você inverte o significado, naturalmente. De 'homem cortado':

--complement
    complement the set of selected bytes, characters or fields

Uma advertência: se alguma das colunas contiver uma vírgula, ela será cortada, porque o corte não é um analisador de CSV da mesma maneira que uma planilha. Muitos Analisadores têm idéias diferentes sobre como lidar com vírgulas de escape em CSV. Para o caso CSV simples, na linha de comando, o corte ainda é o caminho a ser seguido.

    
por 21.03.2012 / 06:08
11

Se os dados forem feitos simplesmente de colunas separadas por vírgula:

cut -d , -f 1-2,4-

Você também pode usar o awk, mas é um pouco estranho porque, ao limpar um campo, é fácil remover o separador. Se você não tem nenhum campo vazio, não é tão ruim:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

Se você tiver CSV real, em que as vírgulas podem aparecer dentro dos campos, se citadas corretamente, será necessário um biblioteca real de CSV .

    
por 21.03.2012 / 20:41