sorting - por - grep linux
Bash: ordenar el archivo de texto por el Ășltimo valor de campo (6)
¿Tal vez invertir los campos de cada línea en el archivo antes de ordenar? Algo 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 las comas nunca se citan de ninguna manera. Si se trata de un archivo CSV completo (en el que las comas se pueden citar con barra invertida o espacio), entonces necesita un analizador CSV real.
Tengo un archivo de texto que contiene ~ 300k filas. Cada fila tiene un número variable de campos delimitados por comas, el último de los cuales se garantiza de forma numérica. Quiero ordenar el archivo por este último campo numérico. 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 que sed, awk quizás la respuesta, pero no estoy seguro de cómo. P.ej:
awk -F, ''{print $NF}'' file.in
me da el último valor de columna, pero ¿cómo usar esto para ordenar el archivo?
Perl de una sola línea:
@lines=<STDIN>;foreach(sort{($a=~/.*,(/d+)/)[0]<=>($b=~/.*,(/d+)/)[0]}@lines){print;}
Python de una sola línea:
python -c "print ''''.join(sorted(open(''filename''), key=lambda l: int(l.split('','')[-1])))"
Usa awk para poner la tecla numérica al frente. $NF
es el último campo del registro actual. Ordenar. Utilice sed para eliminar la clave duplicada.
awk -F, ''{ print $NF, $0 }'' yourfile | sort -n -k1 | sed ''s/^[0-9][0-9]* //''
Voy a lanzar el mío aquí como alternativa (y no pude hacerme cargo de que funcione) :)
archivo de muestra:
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/)*//1/'' file.txt | sort`; do grep $i file.txt; done > file_sort.txt
vim file.in -c ''%sort n /.*,/zs/'' -c ''saveas file.out'' -c ''q''