Tengo un par de comandos en un script awk que estoy escribiendo:
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}
Qué salidas:
Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55
¿Cómo puedo usar el sort
comando en mi script awk para ordenar SOLAMENTE a los jugadores y sus números?
command-line
text-processing
awk
KM142646
fuente
fuente
x
y luego establecerlasPROCINFO["sorted_in"]
en un valor críptico, luego genera la matriz. Yo no iría allí... | sort -k2,2
....| sort -k2,2
si hay otras líneas que necesitan imprimirse? Verifica la pregunta editada.echo
unir la línea de encabezado desde el shell, luego ejecute laawk | sort
tubería.Respuestas:
puedes agregar
| sort -k2
a tu comando. Esto se ordenará alfabéticamente según la segunda columna.Ejemplo:
resultados en
fuente
{print x, $2}
directamente en el código del script? Recibo un error al realizar la tuberíaif(sum[x] > 500) {print x, $2} | sort -k2
.if(sum[x] > 500) {print x, $2}
es el código Awk mientras que| sort -k2
es un comando de shell. Obviamente no puedes mezclar los dos así porque son idiomas diferentes. En su lugar, debe aplicar elsort
comando a la salida del intérprete Awk que ejecuta su fragmento de código Awk. Si no sabe a qué me refiero, expanda su pregunta para darnos una imagen completa../my-script.sh | sort -k2
. 2. agregar `| ordena -k2` a la línea de tu script que produce la salida dada en tu pregunta.Aunque no lo recomendaría (dada la relativa simplicidad de canalizar el resultado a través de un
sort
comando externo ), puede hacerlo al menos con versiones recientes de GNU awk (al menos 4.0 IIRC), como se describe en Clasificación de valores e índices de matriz con gawkA continuación, le mostramos cómo podría implementarlo, suponiendo que tenga los datos en una matriz asociativa en la que se encuentra el índice
Firstname Lastname
. Primero, debe definir una función de comparación personalizada que divida el índice, primero compareLastname
luego (como un desempate) en,Firstname
p. Ej.Ahora puede usar el
PROCINFO["sorted_in"]
método de clasificación de matriz mencionado en los comentarios de @zwetsPoniendo todo junto
Pruebas:
En versiones menores o anteriores de awk, su mejor opción puede ser almacenar los datos indexados
Lastname Firstname
, ordenarlos con los convencionalesasorti
, luego dividir e intercambiar los campos de los índices a medida que recorre la matriz para imprimirla:fuente
Para
sort
solo el segundo campo separado por espacios en blanco, use la tecla-k2,2
:por defecto
sort
realiza la clasificación lexicográficamente.Tenga en cuenta que, si no menciona el último campo para la clave de clasificación, es decir, si solo lo usa
-k2
, es posible que no obtenga el resultado deseado, ya que esto se hará desort
acuerdo con todos los campos comienzan desde el segundo.También consultar
man sort
.fuente
Tratar
Donde myscript.awk contiene comandos puramente awk.
Si su script real es un script de shell, tiene varias opciones que incluyen
./myscript.bash | sort -k2
Reescribe el código como una función dentro del script en
lugar de
Hacer
Pero tenga en cuenta que también puede aplicar el ordenamiento a la estructura do ... done en lugar de hacer una función.
fuente
Para ordenar sus datos para imprimir:
Suponga que desea imprimir el segundo campo (espacios en blanco separados) use esto:
p.ej:
Si desea imprimir la totalidad de su
data.txt
pero ordenado en la columna 2, entonces:Use esta (s) lógica (s) en su requerimiento.
Puede usar
man sort
para características más interesantes desort
.fuente
¿Qué pasa a continuación:
Funciona cuando lo probé.
fuente
Para ordenar la salida a un archivo:
fuente