找到相对于文件中的列的“N”最小值和“N”最大值,并打印特定行

时间:2013-12-24 00:30:01

标签: perl bash unix scripting awk

我有一个制表符分隔文件,例如

Jack    2   98  F
Jones   6   25  51.77
Mike    8   11  61.70
Gareth  1   85  F
Simon   4   76  4.79
Mark    11  12  38.83
Tony    7   82  F
Lewis   19  17  12.83
James   12  1   88.83

我想在最后一次打印具有这些值的行中找到N个最小值和N个最大值(大于5)。我想忽略E的行。例如,如果我想在上面的数据中最少两个值和最大值,我的输出将是

最小案例

Simon   4   76  4.79
Lewis   19  17  12.83

最大案例

James   12  1   88.83
Mike    8   11  61.70

我可以使用

忽略第四列中没有数值的列
awk -F "\t" '$4+0 != $4{next}1' inputfile.txt

我也可以管道输出并使用

找到一个最小值
awk -F "\t" '$4+0 != $4{next}1' inputfile.txt |awk 'NR == 1 || $4 < min {line = $0; min = $4}END{print line}'

并且类似于最大值,但是如何将其扩展为多个值,例如上面的玩具示例中的2个值,以及10个实际数据的值。

3 个答案:

答案 0 :(得分:1)

n可能是一个变量。在这种情况下,我设置了n=3。不是,如果最后一列中有相同值的行,则可能会出现问题。

kent$  awk -v n=3 '$NF+0==$NF{a[$NF]=$0}
        END{ asorti(a,k,"@ind_num_asc")
                print "min:"
                for(i=1;i<=n;i++) print a[k[i]]
                print "max:"
                for(i=length(a)-n+1;i<=length(a);i++)print a[k[i]]}' f
min:
Simon   4   76  4.79
Lewis   19  17  12.83
Mark    11  12  38.83
max:
Jones   6   25  51.77
Mike    8   11  61.70
James   12  1   88.83

答案 1 :(得分:1)

您可以通过一点重定向立即获得最小值和最大值:

minmaxlines=2
( ( grep -v 'F$' inputfile.txt | sort -n -k4 | tee /dev/fd/4 | head -n $minmaxlines >&3 ) 4>&1 | tail -n $minmaxlines ) 3>&1

答案 2 :(得分:0)

这是解决问题的管道方法。

$ grep -v 'F$' inputfile.txt | sort -nk 4  | head -2
Simon   4   76  4.79
Lewis   19  17  12.83

$ grep -v 'F$' inputfile.txt | sort -rnk 4 | tail -2
Mike    8   11  61.70
James   12  1   88.83