Como ordenar uma coleção de linhas de arquivos diferentes?

4

Eu quero classificar a segunda linha em cada arquivo pela segunda coluna e também imprimir o nome do arquivo correspondente. Eu estou fazendo assim -

rm tmp;
for filename in file*; do
  num='head -2 $filename | tail -1 | awk '{print $2}'';
  echo "$filename $num" >> tmp;
done;
sort -n -k2,2 tmp      

Pode ser feito de uma maneira melhor que não inclua um arquivo tmp ?

    
por user13107 25.07.2014 / 04:56

2 respostas

3

Tente:

$ awk 'FNR == 2' file1 file2 filen | sort -n -k2,2

Com gawk , você pode usar nextfile para eficiência:

$ gawk 'FNR == 2 {print FILENAME,$2; nextfile}' file1 file2 filen | sort -n -k2,2

ou você pode escrever sua própria função nextfile em outras implementações awk , consulte isso .

Se você não tem gawk , pode usar perl para mais portáteis:

$ perl -anle 'print "$ARGV $F[1]" and close ARGV if $. == 2' file1 file2 filen |
  sort -n -k2,2
    
por 25.07.2014 / 04:59
1
for f in file* ; do { 
    read line
    read na num na
} <"$f"
    printf '%s\t%s\n' "$f" "$num"
done | sort -t\<tab> -n -k2,2

Embora seja difícil dizer com certeza porque você não nota o separador de campo, o acima assume awk defaults, mas faz o trabalho com o shell script nativo, eu acho.

    
por 25.07.2014 / 06:54