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
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
Eu acho que uma grande parte do problema aqui é
... -k 1 ...
Os argumentos sort
-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
Tags sort csv table sc-spreadsheet