web-dev-qa-db-fra.com

Vous utilisez AWK pour trouver le plus petit et le plus grand nombre dans une colonne?

Si j'ai un fichier avec peu de colonne et que je veux utiliser une commande AWK pour afficher le plus grand et le plus petit numéro dans une colonne particulière!

exemple:

a  212
b  323
c  23
d  45
e  54
f  102

Je veux que ma commande montre que le nombre le plus bas est 23 et une autre commande pour dire le nombre le plus élevé est 323

Je ne sais pas pourquoi les réponses ne fonctionnent pas! Je mets un exemple plus réaliste de mon dossier (peut-être devrais-je mentionner que c'est déterminé par un onglet)

##FORMAT=<ID=DP,Number=1,Type=Integer,Description="# high-quality bases">
##FORMAT=<ID=SP,Number=1,Type=Integer,Description="Phred-scaled strand bias P-value">
##FORMAT=<ID=PL,Number=-1,Type=Integer,Description="List of Phred-scaled genotype likelihoods, number of values is (#ALT+1)*(#ALT+2)/2">
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  rmdup_wl_25248.bam
Chr10   247     .       T       C       7.8     .       DP=37;AF1=0.5;CI95=0.5,0.5;DP4=7,1,19,0;MQ=15;FQ=6.38;PV4=0.3,1,0.038,1 GT:PL:GQ        0/1:37,0,34:36
Chr10   447     .       A       C       75      .       DP=30;AF1=1;CI95=1,1;DP4=0,0,22,5;MQ=14;FQ=-108 GT:PL:GQ        1/1:108,81,0:99
Chr10   449     .       G       C       35.2    .       DP=33;AF1=1;CI95=0.5,1;DP4=3,2,20,3;MQ=14;FQ=-44;PV4=0.21,1.7e-06,1,0.34        GT:PL:GQ        1/1:68,17,0:31
Chr10   517     .       G       A       222     .       DP=197;AF1=1;CI95=1,1;DP4=0,0,128,62;MQ=24;FQ=-282      GT:PL:GQ        1/1:255,255,0:99
Chr10   761     .       G       A       27      .       DP=185;AF1=0.5;CI95=0.5,0.5;DP4=24,71,8,54;MQ=20;FQ=30;PV4=0.07,8.4e-50,1,1     GT:PL:GQ        0/1:57,0,149:60
Chr10   1829    .       A       G       3.01    .       DP=74;AF1=0.4998;CI95=0.5,0.5;DP4=18,0,54,0;MQ=19;FQ=4.68;PV4=1,9.1e-12,0.003,1 GT:PL:GQ        0/1:30,0,45:28

Je devrais dire que j’ai déjà ajouté une ligne d’exclusion commençant par #, c’est la commande que j’utilise:

awk '$1 !~/#/' | awk -F'\t' 'BEGIN{first=1;} {if (first) { max = min = $6; first = 0; next;} if (max < $6) max=$6; if (min > $6) min=$6; } END { print min, max }' wl_25210_filtered.vcf

awk '$1 !~/#/' | awk -F'\t' 'BEGIN{getline;min=max=$6} NF{ max=(max>$6)?max:$6 min=(min>$6)?$6:min} END{print min,max}' wl_25210_filtered.vcf

et

awk '$1 !~/#/' | awk -F'\t' '
NR==2{min=max=$6;next}
NR>2 && NF{
    max=(max>$6)?max:$6
    min=(min>$6)?$6:min
}
END{print min,max}' wl_25210_filtered.vcf
11
mahmood

Vous pouvez créer deux fonctions définies par l'utilisateur et les utiliser selon vos besoins. Cela offrira une solution plus générique. 

[jaypal:~/Temp] cat file
a  212
b  323
c  23
d  45
e  54
f  102
[jaypal:~/Temp] awk '
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;}
function min(x){i=max(x);for(val in x){if(i>x[val]){i=x[val];}}return i;}
{a[$2]=$2;next}
END{minimum=min(a);maximum=max(a);print "Maximum = "maximum " and Minimum = "minimum}' file
Maximum = 323 and Minimum = 23

Dans la solution ci-dessus, il existe 2 fonctions définies par l'utilisateur - max et min. Nous stockons la colonne 2 dans un tableau. Vous pouvez stocker chacune de vos colonnes comme ceci. Dans l'instruction END, vous pouvez appeler la fonction, stocker la valeur dans une variable et l'imprimer. 

J'espère que cela t'aides!

Mettre à jour:

Exécuté ce qui suit selon le dernier exemple - 

[jaypal:~/Temp] awk '
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;}
function min(x){i=max(x);for(val in x){if(i>x[val]){i=x[val];}}return i;}
/^#/{next}
{a[$6]=$6;next}
END{minimum=min(a);maximum=max(a);print "Maximum = "maximum " and Minimum = "minimum}' sample
Maximum = 222 and Minimum = 3.01
4
jaypal singh

Si votre fichier contient des lignes vides, aucune des solutions publiées ne fonctionnera. Pour traiter correctement les lignes vides, essayez ceci:

$ cat f.awk
BEGIN{getline;min=max=$6}
NF{
    max=(max>$6)?max:$6
    min=(min>$6)?$6:min
}
END{print min,max} 

Puis lancez cette commande:

sed "/^#/d" my_file | awk -f f.awk

Au début, il attrape la première ligne du fichier pour définir les valeurs min et max. A la fin, le résultat est imprimé.

HTH Chris

6
Chris
awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt
2
lel7lel7

Le min peut être trouvé par:

awk 'BEGIN {min=1000000; max=0;}; { if($2<min && $2 != "") min = $2; if($2>max && $2 != "") max = $2; } END {print min, max}' file

Cela produira le minimum et le maximum, séparés par des virgules

1
kakoma
awk 'BEGIN{first=1;} 
     {if (first) { max = min = $2; first = 0; next;}
      if (max < $2) max=$2; if (min > $2) min=$2; }
     END { print min, max }' file
1
codaddict

Utilisez les blocs BEGIN et END pour initialiser et imprimer des variables qui gardent une trace des valeurs min et max.

par exemple.,

awk 'BEGIN{max=0;min=512} { if (max < $1){ max = $1 }; if(min > $1){ min = $1 } } END{ print max, min}'
1
Christopher Neylan