Como usar a classificação awk pela coluna 3


92

Eu tenho um arquivo (user.csv) como este

ip,hostname,user,group,encryption,aduser,adattr

deseja imprimir todas as colunas classificadas por usuário,

Eu tentei awk -F ":" '{print|"$3 sort -n"}' user.csv, não deu certo.


12
sort -t, -k3 file
Kevin

Respostas:


181

Que tal apenas sort.

sort -t, -nk3 user.csv

Onde

  • -t,- define seu delimitador como ,.

  • -n- dá a classificação numérica. Adicionado desde que você o adicionou em sua tentativa. Se o seu campo de usuário for somente texto, você não precisará dele.

  • -k3- define o campo (chave). o usuário é o terceiro campo.


2
Como posso usar classificar 2 colunas? por exemplo, quero classificar pela coluna 6 primeiro e classificar pela coluna 3 segundo.
user2452340

1
Isso não funcionará se houver strings entre aspas contendo vírgulas no CSV (a menos que a coluna pela qual você deseja classificar seja anterior à coluna que contém vírgulas). Você pode ter que fazer uma passagem primeiro com awk (usando FPAT = "[^,] * | \" [^ \ "] * \" "e OFS =" | "ou algum outro delimitador que você possa usar com classificação)
davemyron

1
@ user2452340 Você pode fazer isso: sort -t, -nk3 filename.csv | sort -t, -nk6- primeiro ele classificará pela coluna 3, em seguida, classificará pela coluna 6 para que a coluna 6 seja classificada corretamente em todo o caminho e para quaisquer linhas em que a coluna 6 seja igual, elas serão classificadas pela coluna 3 .
Mateus

3
@Matthew sort -t ',' -k3,3n -k6,6nficará melhor. -k3usará a coluna 3 e o resto da linha.
Kusalananda

1
Eu só precisava do -t, para dividir meu arquivo de 2 colunas dividido por vírgulas, obrigado jaypal
Ricardo Rivera Nieves

22
  1. Use awk para colocar o ID do usuário na frente.
  2. Ordenar
  3. Use sed para remover o ID do usuário duplicado, supondo que os IDs do usuário não contenham nenhum espaço.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Isso é muito útil, especialmente se você precisar analisar ou combinar colunas para adicionar um campo de classificação e, em seguida, reter apenas a linha original. Usei awk / split para analisar / combinar campos de data e hora para uma classificação e, em seguida, remover.
skytaker

1
sortjá sabe como classificar por uma coluna específica, mas essa técnica - conhecida como transformação de Schwartzian - é útil quando o campo que você deseja classificar não é trivialmente uma coluna bem definida.
tripleee

11

Você pode escolher um delimitador, neste caso eu escolhi dois pontos e imprimi a coluna número um, ordenando por ordem alfabética:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

e por ordem inversa

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 

6

tente isso -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

OU

sort -t',' -nk3 user.csv

3
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

Isso deve funcionar


0

Para excluir a primeira linha (cabeçalho) da classificação, divido-a em dois buffers.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.