orderar parte de un file

¿Cómo puedo orderar el file por la segunda columna desde la terminal? El contenido del file es:

Nome Note ------------ Mehdi 0 Sunday 20 Others 10 Shnou 5 

Usar sort -t' ' -nk2 no me da el resultado correcto. Además, ¿cómo puedo asegurarme de que el contenido del file permanezca orderado?

Creo que lo que buscas es algo como esto:

Método n. ° 1: uso de cabeza y queue

 $ (head -n 2 sample.txt; tail -n +3 sample.txt | sort -t' ' -nk2) > a.tmp && mv a.tmp sample.txt Nome Note ------------ Mehdi 0 Shnou 5 Others 10 Sunday 20 

Esto toma la primera línea del file de text, luego lo intercepta todo después de las primeras 2 líneas que luego se ordera.

Método n. ° 2: solo usando la cabeza

 $ (head -n 2; sort -t' ' -nk2) < sample.txt > a.tmp && mv a.tmp sample.txt Nome Note ------------ Mehdi 0 Shnou 5 Others 10 Sunday 20 

Toma el file de text como input, muestra solo la primera línea, ordera el rest.

Por lo general, no es una buena idea editar los files en su lugar. Es posible, pero es mejor usar un file intermedio.

Método n. ° 3: Hacer n. ° 2 sin un file intermedio

Al robar la idea de @StephaneChazelas, puede hacer lo siguiente usando la notación "1 <>" para abrir un file para lectura y escritura, y las mejoras que sugiere con el command sort .

 $ (head -n 2; sort -nk2) < sample.txt 1<> sample.txt Nome Note ------------ Mehdi 0 Shnou 5 Others 10 Sunday 20 

Para sobrescribir el file en su lugar, puede hacer:

 { head -n 2 && sort -k2n } < the-file.txt 1<> the-file.txt 

Eso funciona porque sort ha leído su input por completo antes de comenzar a escribir su salida, por lo que está bien escribir en el file desde el que está leyendo. Además, su salida es del mismo tamaño que su input, por lo que no es necesario truncar el file al final.

Tenga en count que si utiliza -t' ' lugar del separador pnetworkingeterminado, cada carácter de espacio en la input creará un nuevo campo, por ejemplo, en:

  a 10 b 2 

(con un espacio antes de b 2 espacios después de b ), -t' ' -nk2 (recuerde que -k2 es para del campo 2 al final de la línea , mientras que -k2,2 es el campo 2 solamente ) compararía "a 10" con " 2" numéricamente, mientras que -nk2 solo compararía " 10" a " 2" numéricamente (y la comparación numérica ignora los espacios en blanco iniciales).