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.

user2452340
fonte
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.

Jaypal Singh
fonte
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/^.* //'
    
user3781670
fonte
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
Diego roberto dos santos
fonte
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

e por ordem inversa

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

tente isso -

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

OU

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

Isso deve funcionar

user13608932
fonte
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"}'
rupert160
fonte