我有一个制表符分隔文件,例如
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个实际数据的值。
答案 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