grep e opções de ordenação

1

Eu tenho os seguintes cabeçalhos de coluna:

EntryDate,HH_ID,HH_type,ID#,Age,First,Last,Gender,Race,Ethnicity,CaseWorkerName

Existem cerca de 2.000 linhas de dados que correspondem muito.

Eu gostaria de classificar por CaseWorkerName e ter todos os valores nas outras colunas alinhadas.

Qual é a melhor maneira de conseguir isso?

    
por D Covington 13.01.2017 / 22:34

1 resposta

5

O CaseWorkerName é a coluna 11. O utilitário sort pode ser informado de qual coluna classificar e qual delimitador usar ao especificar colunas:

$ sort -t ',' -k11,11 data.in

Isto dirá a sort para usar vírgulas como delimitadores e ordenar na coluna 11 a 11 com base na ordem lexicográfica ascendente (ou seja, apenas na coluna 11).

A saída é gravada no console. Se você quiser armazenar a saída em outro arquivo, use

$ sort -t ',' -k11,11 -o data.out data.in

Não há problema em especificar data.in como arquivo de saída se você usar o -o flag para fazer isso.

Se você deseja evitar a classificação da primeira linha (pode conter os cabeçalhos das colunas), primeiro devemos separar o cabeçalho dos dados:

$ head -n 1 data.in >data.header
$ sed '1d' data.in  >data.unsorted

Em seguida, ordene e reúna os dados classificados com o cabeçalho:

$ sort -t ',' -k1,11 -o data.sorted data.unsorted
$ cat data.header data.sorted >data.out
$ rm data.sorted data.header data.unsorted

Ou mais curto

$ sed '1d' data.in  | sort -t ',' -k11,11 -o data.sorted
$ head -n 1 data.in | cat - data.sorted >data.out
$ rm data.sorted

Se você está em um sistema Linux usando o GNU coreutils, isso pode ser ainda mais curto,

$ ( head -n 1; sort -t ',' -k11,11 ) <data.in >data.out

Com a implementação GNU coreutils de head , a entrada padrão para o subprocesso ( (...) ) será consumida primeiro por head , enquanto os dados restantes serão fornecidos para sort . A saída do subprocesso será a saída de head , seguida pela saída de sort .

Em outros sistemas, head pode consumir mais do que o esperado do fluxo de entrada padrão, o que dará sort nothing (ou pelo menos não o restante do arquivo) para trabalhar. Este é o caso em pelo menos o OpenBSD.

O resultado está em data.out após cada exemplo acima.

Note que todas essas abordagens falharão se os dados em qualquer coluna contiverem uma vírgula ...

    
por 13.01.2017 / 22:56

Tags