Classificando um arquivo CSV, mas não o cabeçalho [duplicado]

2

Eu preciso classificar um arquivo CSV, mas a linha de cabeçalho (1ª linha) continua sendo classificada. É isso que estou usando:

cat data1.csv | sort -t"|" -k 1 -o data1.csv 

Aqui está uma linha de amostra:

Name|Email|Country|Company|Phone 
Brent Trujillo|[email protected]|Burkina Faso|Donec LLC|(612) 943-0167
    
por Frank Wilson 29.11.2014 / 22:05

2 respostas

6

Isso deve funcionar e sair para data2.csv :

head -n 1 data1.csv > data2.csv &&
tail -n +2 data1.csv | sort -t "|" -k 1 >> data2.csv
    
por 29.11.2014 / 22:24
0

Eu acho que uma grande parte do problema aqui é

... -k 1 ...
Os argumentos sort de -k implicam pelo menos a -k [num] início e ,[num] end referência para cada um. Dizer que -k 1 é efetivamente diferente de especificar nenhuma chave de classificação, pois sem uma referência final, sort classificará as linhas do início da linha até o final.

Se você quisesse sort linhas somente no primeiro campo | -delimited, seria necessário fazer isso:

... -k1,1 ...

Se você fez isso e se a sua primeira linha começou com | , então com o GNU sort você poderia fazer ...

sort -st\| -k1,1 <infile >outfile

... e a primeira linha permaneceria como está - você obteria o comportamento desejado.

Especifiquei o GNU sort acima porque o POSIX especifica sort para avaliar todos os bytes em uma linha como significativos para a comparação depois de esgotar todas as chaves de classificação em uma% não -u niquesort op (duas vezes - linhas adjacentes com a mesma chave são especificadas para pelo menos descartar modificadores após a primeira passagem) e linhas adjacentes com a mesma chave permanecem. Isso significa que para ...

printf '|%s\n' 9 1 | sort -nk1,1

... um POSIX sort imprime ...

|1
|9

... o que pode ser contra-intuitivo, já que o primeiro campo - e o único correspondido por qualquer argumento -k - está completamente vazio. Por padrão, o GNU sort também imprime o mesmo, mas quando a opção -s table sort é especificada, ela imprime ...

|9
|1

... já que ele não avalia nenhuma linha além do permitido pelos campos especificados na linha de comando, da mesma maneira que faria para uma -u nique sort - embora não remova dups para uma -s table sort.

Sem alterar seu arquivo, se sua linha de cabeçalho é a primeira e se você está classificando com um GNU sort você pode fazer:

{ printf \|; cat file; } | 
sort -st\| -k1,1 | 
sed 's/.//;q'

... o que, como eu acho, você obterá os resultados desejados no stdout.

Ou algo parecido ...

{ printf \|; cat file; } | 
nl -ba -s\| |
sort -t\| -k2,2 -k1n,1 |
cut -d\| -f2-

... para uma coisa certa com qualquer implementação talvez

    
por 30.11.2014 / 07:36