如何使用awk查找最大和最小数字?

如何使用awk查找最大和最小数字?,awk,compare,Awk,Compare,我试图在一列中找出最大和最小的数字。输出应具有最大和最小数字以及最大和最小数字的名称 我写的awk代码如下: BEGIN{first=1;} {if (first) { max = min = $2; first = 0; next;} if (max < $2) max=$2 cmax=$1 ; if (min > $2) min=$2 cmin=$1; } END { print cmin min \n cmax max } BEGIN{first=1;}

我试图在一列中找出最大和最小的数字。输出应具有最大和最小数字以及最大和最小数字的名称

我写的awk代码如下:

 BEGIN{first=1;}
     {if (first) { max = min = $2; first = 0; next;}
     if (max < $2) max=$2 cmax=$1 ; if (min > $2) min=$2 cmin=$1; }
END { print cmin min \n cmax max }
BEGIN{first=1;}
{if(first){max=min=2;first=0;next;}
如果(最大值<$2)最大值=$2 cmax=$1;如果(最小值>$2)最小值=$2 cmin=$1;}
结束{print cmin min\n cmax max}

你能帮我指出这段代码有什么问题吗?

问题是行
if(max<$2)max=$2cmax=$1
if(min>$2)min=$2cmin=$1
应该是
if(max<$2){max=$2;cmax=$1}
if(min>$2){min=$2;cmin=$1}
。另一个错误是行
print cmin min\n cmax max
,它至少应该是
print cmin min“\n”cmax max
。当您对代码进行更好的格式化时,很容易发现错误:

BEGIN{
    first=1
}
{
    if (first) {  # We should move this to it's own block and test against NR
        max = min = $2
        first = 0
        next
    }    
    if (max < $2) {  # confusing using max to store min
        max=$2 
        cmax=$1 
    }
    if (min > $2) { # and min to store max your operators are the wrong way round
       min=$2 
       cmin=$1
    } 
}
END { 
    print cmin min "\n" cmax max  
}

如果您编辑问题以提供示例输入、该示例的预期输出以及当前输出或错误消息,将非常有用。祝你好运。谢谢你,非常有用的回复。goofy edge case,但如果文件为空,则在printf中使用%d而不是%s作为数字不会有任何影响。您可能还想在printf的末尾添加一个“\n”(我没有检查OP想要什么)。您也可以进行创造性测试,以确定cmin是否为“”,如果是,则打印“NaN”或其他内容。这取决于你的投资程度!
NR==1{                   # If we are on the first line in the file
    min=max=$2           # Set initial min/max values
    next                 # Skip to next line
}
{
    if ($2 > max) {      # If the value in field 2 is greater than current max
        max=$2           # Store the new values
        cmax=$1 
    } 
    if ($2 < min) {      # If the value in field 2 is less than current min
        min=$2           # Store the new values
        cmin=$1
    } 
}
END {
    # Use printf to properly format the output
    printf "%s %d\n%s %d\n",cmin,min,cmax,max
}
sort -nk2 file | awk 'NR==1{print}END{print}'