Ordenar archivos .dat por datos internos

Ordenar archivos .dat por datos internos

Tengo varios archivos .dat (variables) con 2 piezas de información cada uno, un peso y una altura, espacio delimitado de la siguiente manera, donde First_Last es un nombre:

18kg 1.2men "Primero1_Último1.dat"

12kg 1.6men "First2_Last2.dat", etc.

Necesito ordenarlos por el primer o segundo valor de cada uno. Estoy pensando que tengo que catcombinar todos los archivos, eliminar las unidades con cut(no estoy tan seguro de eso), luego agregar los nombres de los archivos como una tercera columna usando pastey finalmente sort -k 1,1 temp.txten mi archivo temporal para obtener el resultado deseado mientras aún poder realizar un seguimiento de de qué archivo proviene cada valor porque necesito los nombres asociados para abrir un archivo diferente para cada persona en el orden correcto después. Entonces mi archivo de salida que usaría se vería así

12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

Me pregunto si hay una mejor manera de hacer esto usando algo integrado o una propiedad del tipo de archivo .dat que me falta. ¿O tal vez usando awk?

Respuesta1

Puede usar grepy sedpara extraer la clave de clasificación y especificar solo ciertas columnas para ordenar:

grep -H kg *.dat \
  | sed 's/^\([^:]\+\):\([0-9.]\+\)kg \+\([0-9.]\+\)m.*$/\2 \3 \1/' \
  | sort -t' ' -k1,2 -g

Salida de ejemplo:

12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

Respuesta2

Si sus archivos solo contienen un dato (línea) cada uno, algo tan simple como esto podría funcionar:

for x in *.dat ; do     
    echo $(< "$x") $x    # print contents of file and add the filename 
done  |  sort -nsk2,2    # stable sort by the second column.

Probé rápidamente con GNU sort y realmente no vi que las unidades o los decimales dieran problemas, pero no doy garantías.

Respuesta3

Tal vez usando (una versión reciente de) GNU awk, suponiendo que por "archivo .dat" solo te refieres a un archivo de texto delimitado por espacios en blanco:

awk -v sort=2 '
  {
    gsub(/kg|m/,"",$0);
    a[$sort]=$0 FS FILENAME;
  }
  END {
    PROCINFO["sorted_in"]="@ind_num_asc";
    for (i in a) print a[i];
  }' *.dat

donde la variable sortestablece la columna para ordenar ( 1o 2); o como una sola línea

awk -v sort=1 '{gsub(/kg|m/,"",$0); a[$sort]=$0 FS FILENAME}; END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a) print a[i]}' *.dat

Pruebas

$ awk -v sort=1 '{gsub(/kg|m/,"",$0); a[$sort]=$0 FS FILENAME}; END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a) print a[i]}' *.dat
12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

y

$ awk -v sort=2 '{gsub(/kg|m/,"",$0); a[$sort]=$0 FS FILENAME}; END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a) print a[i]}' *.dat
18 1.2 First1_Last1.dat
12 1.6 First2_Last2.dat

información relacionada