Tengo un archivo de texto que contiene ~300k filas. Cada fila tiene un número variable de coma-campos delimitados, el último de los cuales se garantiza numérica. Quiero ordenar el archivo por este último campo numérico. Yo no puedo hacer:

sort -t, -n -k 2 file.in > file.out

como el número de campos en cada fila no es constante. Creo sed, awk tal vez la respuesta, pero no sabe cómo. E. g:

awk -F, '{print $NF}' file.in

me da el último valor de la columna, pero cómo utilizar esta opción para ordenar el archivo?

InformationsquelleAutor Richard H | 2010-09-30

6 Comentarios

  1. 32

    Uso de awk para poner la tecla numérica hasta el frente. $NF es el último campo del registro actual. De ordenación. Uso de la sed para eliminar el duplicado de la llave.

    awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
    • no hay necesidad de redirección. awk -F, '{ print $NF, $0 }' yourfile
  2. 2
    vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'
    • ¿Por qué no utilizar ex si vas a ir por ese camino? Vim tiene esa funcionalidad particular de ex de todos modos.
    • ex es sólo vim, con el -e opción. Realmente no importa en este caso.
    • ex anterior vim (y vi) por un tiempo bastante largo. vim puede tener un ex modo de emulación, pero esto no lo hace ex.
    • Sí. Pero si usted tiene vim en su sistema, ex va a ser un enlace simbólico a vim por lo general. Vim detecta al inicio ¿qué nombre ha sido invocado bajo.
  3. 0

    Tal vez revertir los campos de cada línea en el archivo antes de la clasificación? Algo así como

    perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' |
      sort -t, -n -k1 |
      perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")'

    debe hacerlo, siempre y cuando comas nunca citado en cualquier forma. Si se trata de un completo archivo CSV (en la que comas puede ser citado con la barra invertida o en el espacio), entonces usted necesita una real CSV analizador.

  4. 0

    Perl one-liner:

    @lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;}
  5. 0

    Voy a lanzar el mío aquí, como una alternativa (y yo no podía conseguir awk para el trabajo) 🙂

    archivo de ejemplo:

    Call of Doody                           1322
    Seam the Ripper                         1329
    Mafia Bots 1                            1109
    Chicken Fingers                         1243
    Batup Light                             1221
    Hunter F Tomcat                         1140
    Tober                                   0833

    código:

    for i in `sed -e 's/.* \(\d\)*//' file.txt | sort`; do grep $i file.txt; done > file_sort.txt

Dejar respuesta

Please enter your comment!
Please enter your name here