linux – 使用AWK查找列中最小和最大的数字?

前端之家收集整理的这篇文章主要介绍了linux – 使用AWK查找列中最小和最大的数字?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有一个列的文件,我想使用AWK命令显示特定列中最大和最小的数字!

例:

  1. a 212
  2. b 323
  3. c 23
  4. d 45
  5. e 54
  6. f 102

我希望我的命令显示最低的数字是23
另一个命令说最高的是323

我不知道为什么答案不行!我把一个更现实的我的文件示例(也许我应该提到这是标签确定)

  1. ##FORMAT=<ID=DP,Number=1,Type=Integer,Description="# high-quality bases">
  2. ##FORMAT=<ID=SP,Description="Phred-scaled strand bias P-value">
  3. ##FORMAT=<ID=PL,Number=-1,Description="List of Phred-scaled genotype likelihoods,number of values is (#ALT+1)*(#ALT+2)/2">
  4. #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT rmdup_wl_25248.bam
  5. 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,0.038,1 GT:PL:GQ 0/1:37,34:36
  6. Chr10 447 . A C 75 . DP=30;AF1=1;CI95=1,1;DP4=0,22,5;MQ=14;FQ=-108 GT:PL:GQ 1/1:108,81,0:99
  7. 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,0.34 GT:PL:GQ 1/1:68,17,0:31
  8. Chr10 517 . G A 222 . DP=197;AF1=1;CI95=1,128,62;MQ=24;FQ=-282 GT:PL:GQ 1/1:255,255,0:99
  9. 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 GT:PL:GQ 0/1:57,149:60
  10. Chr10 1829 . A G 3.01 . DP=74;AF1=0.4998;CI95=0.5,0.5;DP4=18,54,0;MQ=19;FQ=4.68;PV4=1,9.1e-12,0.003,1 GT:PL:GQ 0/1:30,45:28

我应该说我已经添加了以#开头的排除行,所以这是我使用的命令:

  1. 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
  2.  
  3. 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

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

解决方法

您可以创建两个用户定义的函数,并根据需要使用它们.这将提供更通用的解决方案.
  1. [jaypal:~/Temp] cat file
  2. a 212
  3. b 323
  4. c 23
  5. d 45
  6. e 54
  7. f 102
  8. [jaypal:~/Temp] awk '
  9. function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;}
  10. function min(x){i=max(x);for(val in x){if(i>x[val]){i=x[val];}}return i;}
  11. {a[$2]=$2;next}
  12. END{minimum=min(a);maximum=max(a);print "Maximum = "maximum " and Minimum = "minimum}' file
  13. Maximum = 323 and Minimum = 23

在上面的解决方案中,有2个用户定义的函数max和min.我们将列2存储在数组中.您可以这样存储每个列.在END语句中,您可以调用函数并将值存储在变量中并进行打印.

希望这可以帮助!

更新:

按照最新的例子执行以下操作 –

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

猜你在找的Linux相关文章