Como han dicho otros, awk no ofrece una funcionalidad como esta de fábrica. Su solución "hackish" puede funcionar para algunos conjuntos de datos, pero no para otros. Considere que puede agregar el mismo valor de matriz dos veces, y quiere que se represente dos veces dentro de la matriz.
$ echo 3 | awk 'BEGIN{ a[1]=5; a[2]=12; a[3]=2 }
> { a[$1] = $1 }
> END {print length(a) " - " a[3]}'
3 - 3
La mejor solución puede ser informada por los datos que están en la matriz, pero he aquí algunas ideas.
En primer lugar, si está seguro de que su índice siempre será numérico, siempre comenzará en 1 y nunca eliminará los elementos de la matriz, entonces la sugerencia de triplee de A[length(A)+1]="value"
puede funcionar para usted. Pero si elimina un elemento, su próxima escritura puede sobrescribir su último elemento.
Si su índice no importa, y no le preocupa desperdiciar espacio con las teclas largas, podría utilizar un número aleatorio que sea lo suficientemente largo como para reducir la probabilidad de colisiones. Una opción & sucia rápida podría ser:
srand()
a[rand() rand() rand()]="value"
recuerde utilizar srand()
para una mejor asignación al azar, y no confiar en rand()
para producir números aleatorios reales. Esta es una solución menos que perfecta en varias formas, pero tiene la ventaja de ser una sola línea de código.
Si sus teclas son numéricos, pero posiblemente escasa, como en el ejemplo que rompería la solución de tripleee, se puede añadir una pequeña búsqueda a su función de empuje:
function push (a, v, n) {
n=length(a)+1
while (n in a) n++
a[n]=v
}
El bucle while asegura que' Asignaremos un índice no utilizado.Esta función también es compatible con matrices que usan índices no numéricos: asigna claves que son numéricas, pero no importa lo que ya está allí.
Tenga en cuenta que awk no garantiza el orden de los elementos dentro de una matriz, por lo que la idea de que "empujará un elemento al final de la matriz" es incorrecta. Agregará este elemento a la matriz, pero no hay garantía de que aparezca como el último cuando ingrese al lazo for
.
$ cat a
#!/usr/bin/awk -f
function push (a, v, n) {
n=length(a)+1
while (n in a) n++
a[n]=v
}
{
push(a, $0)
}
END {
print "length=" length(a)
for(i in a) print i " - " a[i]
}
$ printf '3\nfour\ncinq\n' | ./a
length=3
2 - four
3 - cinq
1 - 3
¡Llamaría así de elegante y minimalista, no de hackish! ;-). Siempre puede escribir sus propias funciones para administrar matrices, pero no hay nada integrado en el lenguaje para eso. Buena suerte. – shellter