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
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
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
awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt
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
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
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}'