Classificando arquivos .dat por dados internos

1

Eu tenho um número de arquivos .dat (variável) com 2 pedaços de informação neles cada, um peso e uma altura, espaço delimitado como o seguinte, onde First_Last é um nome:

18kg 1.2m em "First1_Last1.dat"

12kg 1.6m em "First2_Last2.dat", etc.

Eu preciso classificá-los pelo primeiro ou segundo valor em cada um. Eu estou pensando que eu tenho que cat e combinar todos os arquivos, tira as unidades com um cut (não tão certo sobre isso), em seguida, adicione os nomes de arquivos como uma terceira coluna usando paste e finalmente sort -k 1,1 temp.txt no meu arquivo temporário para obter minha saída desejada e ainda ser capaz de controlar de qual arquivo cada valor veio porque preciso que os nomes associados abram um arquivo diferente para cada pessoa na ordem correta depois. Então, meu arquivo de saída que eu usaria seria algo parecido com

12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

Eu estou querendo saber se há uma maneira melhor de fazer isso usando algo embutido ou uma propriedade do tipo de arquivo .dat que eu estou ausente. Ou talvez usando awk ?

    
por Matt Ruth 03.10.2016 / 11:52

3 respostas

0

Se os seus arquivos contiverem apenas um dado (linha), algo simples como isso pode 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.

Eu testei rapidamente com o tipo GNU, e realmente não vi as unidades ou decimais dando problemas, mas não dou garantias.

    
por 03.10.2016 / 12:20
1

Você pode usar grep e sed para extrair a chave de classificação e especificar apenas algumas colunas para classificação:

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

Exemplo de saída:

12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat
    
por 03.10.2016 / 12:11
0

Talvez usando (uma versão recente do) GNU awk - assumindo que por "arquivo .dat" você apenas se refere a um arquivo de texto delimitado por espaços em branco:

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

em que a variável sort define a coluna para classificação ( 1 ou 2 ); ou como um one-liner

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

Teste

$ 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

e

$ 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
    
por 03.10.2016 / 12:49

Tags