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.


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.


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/^.* //'
    

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

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

y por orden inverso

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

6

prueba esto -

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

O

sort -t',' -nk3 user.csv


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"}'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.