Classifique um arquivo, mas mantenha os pares de linhas juntos

3

Eu tenho um arquivo com entradas como as seguintes:

female,9,13,6.3152956461
female,12,12,5.4797699786
female,11,11,3.6421699174
female,9,14,4.5933365997
female,8,14,2.4181574607

Primeiramente, quero remover todas as duas primeiras, exceto as duas, e separá-las por um espaço em vez de uma vírgula. No final das contas, meu problema é que eu preciso classificar pela coluna 1, depois pela coluna 2, mas tenho que manter o pareamento em uma determinada linha intacto.

Acredito que preciso usar o sed para alternar o deliminador de coluna e classificar para fazer a classificação, mas não consigo descobrir como manter os pares de linhas juntos entre os dois tipos.

    
por kirara88 21.09.2017 / 13:00

2 respostas

9

Você quer dizer assim?

$ sort -t, -k1,1 -k2,2n file
female,8,14,2.4181574607
female,9,13,6.3152956461
female,9,14,4.5933365997
female,11,11,3.6421699174
female,12,12,5.4797699786

Isso classificará , -delimited dados no primeiro campo em ordem alfabética, depois no segundo campo numericamente. A classificação primeiro classificará usando o primeiro campo e, para registros que tiverem primeiros campos idênticos, o segundo campo será usado para classificação.

Para remover as últimas colunas depois (ou melhor, mantenha as colunas 1 e 2):

$ sort -t, -k1,1 -k2,2n file | cut -d, -f1,2
female,8
female,9
female,9
female,11
female,12

Para remover essa vírgula também:

$ sort -t, -k1,1 -k2,2n file | cut -d, -f1,2 | tr ',' ' '
female 8
female 9
female 9
female 11
female 12

Mas isso não é necessário para a classificação, obviamente, como você pode dizer sort que delimitador usar.

    
por 21.09.2017 / 13:11
3

Tente isto :

awk 'BEGIN {FS=","} {print $1, $2}' file | sort -k1,1 -nk2,2

Explicação :

  1. 'BEGIN {FS=","} {print $1, $2}' - configura o separador de campo para , (espaço por padrão) e imprime somente os primeiros campos ( $1 ) e segundo ( $2 );
  2. file - você arquiva (você pode usar o pipe em vez disso: cat file | awk etc... );
  3. sort -k1,1 -nk2,2 - ordenar pelo primeiro campo ( -k1,1 ) e o próximo passo - ordenar pelo segundo campo numericamente ( -nk2,2 )

Vamos complicar seu exemplo (na verdade, seus primeiros campos são iguais). Suponha que você tenha um arquivo de entrada diferente como este:

male,9,13,6.3152956461
female,12,12,5.4797699786
female,11,11,3.6421699174
male,9,14,4.5933365997
male,8,14,2.4181574607

A saída será:

male 8
male 9
male 9
female 11
female 12

É disso que você precisa?

    
por 21.09.2017 / 13:08

Tags