O arquivo ordenado não é salvo corretamente [fechado]

0

Se eu classificar um arquivo, quero salvá-lo no novo. Eu uso para isso apenas:

sort -nk{fieldnumber} test.json > testsort.json

Na saída, as colunas são embaralhadas e a coluna, que eu classifiquei, está em ordem aleatória (não crescente). Por que isso acontece? Além disso, quero dividir esse arquivo classificado em várias partes. Eu desejo que todas as partes também sejam classificadas pela coluna, como aqui:

partaa
{'a':'a', 'b':'b', 'c':1}
{'a':'a', 'b':'b', 'c':1}
{'a':'a', 'b':'b', 'c':2}

partab
{'a':'a', 'b':'b', 'c':2}
{'a':'a', 'b':'b', 'c':3}
{'a':'a', 'b':'b', 'c':3}

partac
{'a':'a', 'b':'b', 'c':4}
{'a':'a', 'b':'b', 'c':5}
{'a':'a', 'b':'b', 'c':6}

Eu uso para isso

split -l 100 testsort.json part

De qualquer forma, eu tenho o tempo todo a saída embaralhada e não ordenada. (por exemplo, algum valor do partac pode ser menor que o partab)

PS

Obrigado, eu encontrei o problema sozinho. A entrada estava corrompida, porque algumas linhas possuem campos adicionais.

{'a':'a', 'b':'b', 'c':2}
{'a':'a', 'b':'b', 'c':1}
{'a':'a', 'b':'b', 'c':2}
{'a':'a', 'b':'b', 'd':'d', 'c':1}
{'a':'a', 'b':'b', 'c':3}
{'a':'a', 'b':'b', 'f':'f', 'c':4}

Eu construo a próxima expressão regular, que procura por determinado campo, pega os valores numéricos, os traz na frente e ordena-os

sed -e 's/^\(.*columnname\)\([^,]*\)/\t/;s/^[" :]*//' test.json | sort -nk1 |sed -e 's/^[^{]*//' > testSort.json
    
por Guforu 19.09.2014 / 09:21

1 resposta

1

O separador de campo de classificação não é especificado em seu comando:

sort -nk25

Por padrão, o separador de campos de classificação consiste em espaços em branco 1 .
Isso significa que você classifica no 25º campo de 3 campos. Não está claro o que você quer classificar - mas você pode tentar classificar na coluna 3 separada por espaço em branco com:

sort -nk3

Dependendo do que você vê exatamente como colunas, você pode encontrar o problema de o separador de campos ser apenas um caractere, não um conjunto de caracteres (ou até mesmo uma expressão regular) - exceto para o caso especial descrito abaixo

Assim, você pode usar a citação como separador de campo, como sort -t"'" ... , e classificar os valores dos caracteres; Não funciona assim com os números, porque eles não são citados.

(1): O separador de campo padrão não consiste em uma contagem única ou fixa de caracteres de espaço. O separador é uma transição não em branco para em branco - isso faz com que qualquer cadeia de espaço em branco que não inicie na primeira coluna seja um separador.

    
por 19.09.2014 / 10:08

Tags