Classificando por 2 campos no ksh

0
file-
xyz.161209:/userlogs/logs/reports 355G 195G 150G 57% /home
xyz.161209:/userlogs/logs/reports 355G 197G 148G 58% /home
xyz.161209:/userlogs/logs/reports 355G 201G 145G 59% /home
xyz.161210:/userlogs/logs/reports 355G 218G 129G 63% /home
xyz.161210:/userlogs/logs/reports 355G 223G 124G 65% /home
xyz.161210:/userlogs/logs/reports 355G 226G 121G 66% /home
xyz.161211:/userlogs/logs/reports 355G 210G 136G 61% /home
xyz.161211:/userlogs/logs/reports 355G 220G 127G 64% /home
xyz.161211:/userlogs/logs/reports 355G 173G 171G 51% /home

Result
xyz.161209:/userlogs/logs/reports 355G 201G 145G 59% /home
xyz.161210:/userlogs/logs/reports 355G 226G 121G 66% /home
xyz.161211:/userlogs/logs/reports 355G 220G 127G 64% /home

Para cada primeira coluna que contenha data classificada, agrupe pela primeira coluna e exiba apenas a linha que contém a quinta coluna com o máximo de%.

Veja o que tentei, mas não consigo obter a saída desejada. Alguém pode me ajudar?

awk -F, '{if ((a[substr($1,5,6)] == substr($1,5,6)) && (b[substr($5,1,2)] < substr($5,1,2)))b[substr($5,1,2)]=substr($5,1,2);}END{for(i in a){print i,a[i];}}' test.txt
    
por Guest 11.12.2016 / 09:32

3 respostas

1

Isso é o que eu criei, duvido que seja a maneira mais eficaz e gostaria de ver algo mais eficiente. No entanto, faz o trabalho

sort test.txt | awk -F':' '{print $1}' | uniq > unique.txt

while read p; do
  grep $p test.txt | sort -r -k5 | head -1
done < unique.txt
rm unique.txt

Explicação:

sort test.txt | awk -F':' '{print $1}' | uniq > unique.txt extrair todos os nomes de arquivos exclusivos da lista

grep $p test.txt | sort -r -k5 | head -1 sort baseado no quinto campo (que tem o valor%) em ordem decrescente e imprime apenas a primeira linha.

    
por 13.12.2016 / 01:56
1

Isso funciona com ksh para mim:

sort -nrk5 -t ' ' test.txt | sort -t '.' -unk2

Dado este arquivo de teste:

  • otherfile_.161209:/userlogs/logs/reports 000G 000G 000G 55% /home
    somefile_.161209:/userlogs/logs/reports 000G 000G 000G 45% /home
    file71.161209:/userlogs/logs/reports 000G 000G 000G 71% /home
    file_longer_12.161209:/userlogs/logs/reports 000G 000G 000G 78% /home
    qwerty_.161210:/userlogs/logs/reports 000G 000G 000G 31% /home
    xyz.161210:/userlogs/logs/reports 000G 000G 000G 34% /home
    abcdef.161210:/userlogs/logs/reports 000G 000G 000G 85% /home
    hellojoe_.161210:/userlogs/logs/reports 000G 000G 000G 45% /home
    kitchen_.161211:/userlogs/logs/reports 000G 000G 000G 39% /home
    room.161211:/userlogs/logs/reports 000G 000G 000G 95% /home
    rooftop_77.161211:/userlogs/logs/reports 000G 000G 000G 12% /home
    f.161211:/userlogs/logs/reports 000G 000G 000G 30% /home

Este é o resultado:

  • file_longer_12.161209:/userlogs/logs/reports 000G 000G 000G 78% /home
    abcdef.161210:/userlogs/logs/reports 000G 000G 000G 85% /home
    room.161211:/userlogs/logs/reports 000G 000G 000G 95% /home

Por isso, permite nomes de arquivos que:

  • Tem comprimentos diferentes
  • Contém caracteres numéricos

Repartição:

  • sort -nrk5 -t ' ' : inicialmente classificar por porcentagem na coluna 5
  • sort -t '.' -unk2 : imprime resultados exclusivos, contando apenas a sequência de datas do primeiro campo (usando um . separador)
por 13.12.2016 / 02:06
0

que tal este awk

awk -F"[.: ]" '{if($(NF-1)+0>Arr[$2]+0){Arr[$2]=$(NF-1)+0;Res[$2]=$0}}END{for (i in Res){print Res[i]}}' file
xyz.161210:/userlogs/logs/reports 355G 226G 121G 66% /home
xyz.161211:/userlogs/logs/reports 355G 220G 127G 64% /home
xyz.161209:/userlogs/logs/reports 355G 201G 145G 59% /home


awk -F"[.: ]" '{
if($(NF-1)+0>Arr[$2]+0)
{
   Arr[$2]=$(NF-1)+0;
    Res[$2]=$0
}
}
END{
for (i in Res)
{
print Res[i]
}
}' file
    
por 13.12.2016 / 03:24