Cómo usar awk ordenar por columna 3

90

Tengo un archivo (user.csv) como este

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

desea imprimir todas las columnas ordenadas por usuario,

Lo intenté awk -F ":" '{print|"$3 sort -n"}' user.csv, no funciona.

usuario2452340
fuente
11
sort -t, -k3 file
Kevin

Respuestas:

174

¿Qué tal solo sort?

sort -t, -nk3 user.csv

dónde

  • -t,- define su delimitador como ,.

  • -n- le da orden numérico. Agregado desde que lo agregó en su intento. Si su campo de usuario es solo texto, entonces no lo necesita.

  • -k3- define el campo (clave). usuario es el tercer campo.

Jaypal Singh
fuente
2
¿Cómo puedo usar ordenar 2 columnas? por ejemplo, quiero ordenar por la columna 6 primero y ordenar por la columna 3 en segundo lugar.
user2452340
1
Esto no funcionará si hay cadenas entre comillas que contienen comas en el CSV (a menos que la columna por la que desee ordenar sea anterior a la columna que contiene comas). Es posible que primero tenga que hacer una pasada con awk (usando FPAT = "[^,] * | \" [^ \ "] * \" "y OFS =" | "o algún otro delimitador que pueda usar con sort)
davemyron
1
@ user2452340 Puede hacer esto: sort -t, -nk3 filename.csv | sort -t, -nk6- primero se ordenará por la columna 3, luego lo ordenará por la columna 6 para que la columna 6 esté ordenada correctamente hasta el final y para cualquier fila donde la columna 6 sea la misma, se ordenarán por la columna 3 .
Mateo
3
@Matthew sort -t ',' -k3,3n -k6,6nserá mejor. -k3usará la columna 3 y el resto de la línea.
Kusalananda
1
Solo necesitaba la -t, para dividir mi archivo de 2 columnas dividido por comas, gracias jaypal
Ricardo Rivera Nieves
20
  1. Utilice awk para poner el ID de usuario al principio.
  2. Ordenar
  3. Utilice sed para eliminar el ID de usuario duplicado, asumiendo que los ID de usuario no contienen espacios.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
usuario3781670
fuente
Esto es muy útil, especialmente si necesita analizar o combinar columnas para agregar un campo de clasificación y luego conservar solo la línea original. Usé awk / split para analizar / combinar los campos de fecha y hora para ordenarlos y luego eliminarlos.
skytaker
1
sortya sabe cómo ordenar por una columna en particular, pero esta técnica, conocida como la transformación de Schwartzian , es útil cuando el campo que desea ordenar no es trivialmente una columna bien definida.
tripleee
10

Puede elegir un delimitador, en este caso elegí dos puntos e imprimí la columna número uno, ordenando por orden alfabético:

awk -F\: '{print $1|"sort -u"}' /etc/passwd
Diego Roberto Dos Santos
fuente
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

y por orden inverso

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

prueba esto -

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

O

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

Esto debería funcionar

usuario13608932
fuente
0

Para excluir la primera línea (encabezado) de la clasificación, la divido en dos búferes.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
rupert160
fuente