awk '{print $NF,$0}' file | sort | cut -f2- -d' '
Básicamente, este comando hace:
- Repita el último campo al principio, separado por un espacio en blanco (OFS predeterminado)
- Ordenar, resolver los nombres de archivo duplicados usando la ruta completa ($0) para ordenar
- Cortar el primer campo repetido, f2- significa desde el segundo campo hasta el último
Una sola línea en perl para invertir el orden de los campos en una línea:
perl -lne 'print join " ", reverse split / /'
Puede usarlo una vez, canalizar la salida para ordenar, luego canalizarlo de nuevo y logrará lo que desea. Puedes cambiar / /
a / +/
por lo que aprieta espacios. Y, por supuesto, puede usar cualquier expresión regular que desee para dividir las líneas.
algo como esto
awk '{print $NF"|"$0}' file | sort -t"|" -k1 | awk -F"|" '{print $NF }'
Aquí hay una línea de comando de Perl (tenga en cuenta que su shell puede requerir que escape del $
s):
perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} <>"
Simplemente canalice la lista o, si la lista está en un archivo, coloque el nombre del archivo al final de la línea de comando.
Tenga en cuenta que esta secuencia de comandos en realidad no cambia los datos, por lo que no debe tener cuidado con el delimitador que utiliza.
Aquí hay una salida de muestra:
>perl -e "print sort {(split '/', $a)[-1] <=> (split '/', $b)[-1]} " files.txt /a/e/f/g/h/01-do-this-first /a/b/c/10-foo /a/b/c/20-bar /a/d/30-bob /a/b/c/50-baz /a/e/f/g/h/99-local