【问题标题】:Using AWK to find the smallest and largest number in a column?使用 AWK 查找列中的最小和最大数字?
【发布时间】:2012-01-26 03:09:08
【问题描述】:

如果我有一个包含几列的文件,并且我想使用 AWK 命令来显示特定列中的最大和最小数字!

示例:

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

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

我不知道为什么答案不起作用!我放了一个更真实的文件示例(也许我应该提到它是由制表符确定的)

##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

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

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

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

【问题讨论】:

  • 问题是我在每一列的顶部都有标签,当我运行你们给出的所有行时。我总是打印标签
  • 查看我的更新答案并在下次发布更好的示例。
  • 检查我更新的答案。

标签: linux awk


【解决方案1】:
awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt

【讨论】:

    【解决方案2】:

    可以通过以下方式找到最小值:

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

    这将输出以逗号分隔的最小值和最大值

    【讨论】:

      【解决方案3】:

      如果您的文件包含空行,则发布的解决方案均无效。 要正确处理空行,请尝试以下操作:

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

      然后运行这个命令:

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

      首先它捕获文件的第一行来设置最小值和最大值。 对于每个非空行,它使用三元运算符检查, 如果找到新的最小值或最大值。最后打印结果。

      HTH 克里斯

      【讨论】:

      • 问题是我在每一列的顶部都有标签,当我运行你们给出的所有行时。我总是打印标签
      【解决方案4】:

      您可以创建两个用户定义的函数并根据需要使用它们。这将提供更通用的解决方案。

      [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
      

      在上述解决方案中,有 2 个用户定义的函数 - maxmin。我们将第 2 列存储在一个数组中。您可以像这样存储每个列。在END 语句中,您可以调用函数并将值存储在变量中并打印它。

      希望这会有所帮助!

      更新:

      按照最新示例执行以下操作 -

      [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
      

      【讨论】:

      • 这是我为第 6 列的文件运行它时得到的答案 最大值 = QUAL 和最小值 =
      • 那么您希望 max amd min 用于哪些列?你的问题没有提到它。
      【解决方案5】:

      使用BEGINEND 块来初始化和打印跟踪最小值和最大值的变量。

      例如,

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

      【讨论】:

      • 如果所有数字都为负数,您的最小值将不正确,如果所有数字都大于 512,您的最大值将不正确。
      • 见这篇文章关于什么“例如”意思是:secure.wikimedia.org/wikipedia/en/wiki/E.g.#exempli_gratia 我认为让操作人员根据他的数据先验做出决定是安全的。
      • print min max 将输出23323 -- 你需要一个逗号。
      • 问题是我在每一列的顶部都有标签,当我运行你们给出的所有行时。我总是打印标签
      • 这对我有用...这些假设对我的数据是正确的 :)
      【解决方案6】:
      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
      

      【讨论】:

      • 这更古怪:awk 'NR==1 {min=$2; max=$2; next} max &lt; $2 {max=$2} min &gt; $2 {min=$2} END {print min, max}' file
      • 问题是我在每一列的顶部都有标签,当我运行你们给出的所有行时。我总是打印标签
      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多