Responder
cat testfile | awk '{ print length, $0 }' | sort -n -s | cut -d" " -f2-
O, para hacer su subclasificación original (quizás no intencional) de cualquier línea de igual longitud:
cat testfile | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-
En ambos casos, hemos resuelto su problema declarado alejándonos de awk para su corte final.
Líneas de longitud coincidente: qué hacer en caso de empate:
La pregunta no especificaba si se deseaba una clasificación adicional para líneas de longitud coincidente. Supuse que esto no es deseado y sugerí el uso de -s
( --stable
) para evitar que tales líneas se ordenen entre sí y mantenerlas en el orden relativo en el que ocurren en la entrada.
(Aquellos que quieran tener más control sobre la clasificación de estos lazos podrían considerar la --key
opción de clasificación ).
Por qué falla la solución intentada de la pregunta (reconstrucción de línea awk):
Es interesante notar la diferencia entre:
echo "hello awk world" | awk '{print}'
echo "hello awk world" | awk '{$1="hello"; print}'
Ceden respectivamente
hello awk world
hello awk world
La sección relevante del manual de (gawk) solo menciona como un aparte que awk reconstruirá la totalidad de $ 0 (basado en el separador, etc.) cuando cambie un campo. Supongo que no es un comportamiento loco. Tiene esto:
"Finalmente, hay momentos en los que es conveniente forzar a awk a reconstruir todo el registro, usando el valor actual de los campos y OFS. Para hacer esto, use la asignación aparentemente inocuo:"
$1 = $1 # force record to be reconstituted
print $0 # or whatever else with $0
"Esto obliga a awk a reconstruir el registro".
Entrada de prueba que incluye algunas líneas de igual longitud:
aa A line with MORE spaces
bb The very longest line in the file
ccb
9 dd equal len. Orig pos = 1
500 dd equal len. Orig pos = 2
ccz
cca
ee A line with some spaces
1 dd equal len. Orig pos = 3
ff
5 dd equal len. Orig pos = 4
g