2013-12-24 47 views
0

我有一个制表符分隔的文件,如查找“N”最小和“N”的最大值相对于文件中的一列,打印特定的行

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 

I还可管这个输出和发现使用

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

并且类似地用于最大值一个最小值,但如何这个扩展到多于一个的值如上面的玩具实施例2倍的值,10例为我真实的数据。

回答

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

你应该提到的是'asorti'需要'GNU awk' – Jotne

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 
+0

为最大的情况下,输入最高的第一。 awk'$ NF!=“F”'file | sort -k4nr | head -2 – BMW

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 
+0

请您解释一下代码,它会在第一个负值后打印空行,如果有负值 – discipulus

相关问题