J’ai un fichier délimité par tabulation tel que
Jack 2 98 F Jones 6 25 51.77 Mike 8 11 61.70 Gareth 1 85 F Simon 4 76 4.79 Mark 11 12 38.83 Tony 7 82 F Lewis 19 17 12.83 James 12 1 88.83
Je veux trouver les N valeurs minimales et N valeurs maximales (plus de 5) dans la dernière impression des lignes qui ont ces valeurs. Je veux ignorer les lignes avec E. Par exemple, si je veux au minimum deux valeurs et maximum dans les données ci-dessus, ma sortie serait
Cas minimum
Simon 4 76 4.79 Lewis 19 17 12.83
Cas maximum
James 12 1 88.83 Mike 8 11 61.70
Je peux ignorer les colonnes qui n’ont pas de valeur numérique dans la quasortingème colonne en utilisant
awk -F "\t" '$4+0 != $4{next}1' inputfile.txt
Je peux également canaliser cette sortie et trouver une valeur minimale en utilisant
awk -F "\t" '$4+0 != $4{next}1' inputfile.txt |awk 'NR == 1 || $4 < min {line = $0; min = $4}END{print line}'
et de même pour la valeur maximale, mais comment puis-je étendre cela à plus d’une valeur comme 2 valeurs dans l’exemple de jouet ci-dessus et 10 cas pour mes données réelles.
n
pourrait être une variable. dans ce cas, je mets n=3
. non, cela peut poser problème s’il y a des lignes avec la même valeur dans la dernière colonne.
kent$ awk -vn=3 '$NF+0==$NF{a[$NF]=$0} END{ asorti(a,k,"@ind_num_asc") print "min:" for(i=1;i<=n;i++) print a[k[i]] print "max:" for(i=length(a)-n+1;i<=length(a);i++)print a[k[i]]}' f min: Simon 4 76 4.79 Lewis 19 17 12.83 Mark 11 12 38.83 max: Jones 6 25 51.77 Mike 8 11 61.70 James 12 1 88.83
Vous pouvez obtenir le minimum et le maximum en même temps avec une petite redirection:
minmaxlines=2 ( ( grep -v 'F$' inputfile.txt | sort -n -k4 | tee /dev/fd/4 | head -n $minmaxlines >&3 ) 4>&1 | tail -n $minmaxlines ) 3>&1
Voici une approche par pipeline du problème.
$ grep -v 'F$' inputfile.txt | sort -nk 4 | head -2 Simon 4 76 4.79 Lewis 19 17 12.83 $ grep -v 'F$' inputfile.txt | sort -rnk 4 | tail -2 Mike 8 11 61.70 James 12 1 88.83