查找第一列的最小值和最大值 - 由第二列

问题描述:

我有很多未排序的数据在文本文件中的格式如下组合:查找第一列的最小值和最大值 - 由第二列

1.0 10 
1.8 10 
1.1 10 
1.9 20 
2.8 20 
2.1 20 
2.9 20 
... 

对于第二列中的每个值,我想获取第一列中的值的间隔。因此,对于上面的例子,结果应该是

1.0 1.8 10 
1.9 2.9 20 

我怎么能做到这一点与C/C++,AWK或其他Linux shell工具?

+0

的问题应该是清楚的。 – oberlies 2014-04-18 14:49:30

您可以使用此AWK:

awk '{ 
     if (!($2 in nmin) || $1<nmin[$2]) 
      nmin[$2]=$1; 
     else if ($1>=nmax[$2]) 
      nmax[$2]=$1 
    } 
    END { 
     for (a in nmin) 
      print nmin[a], nmax[a], a 
    } 
' inFile 
+1

太酷了。谢谢。 – Dong 2013-05-06 14:54:54

+0

小修改:如果(!($ 2 in nmin)|| $ 1 = nmax [$ 2]) \t \t nmax [$ 2] = $ 1; } END { \t为(在n最小一){ \t \t如果 \t \t \t打印n最小并[a],n最小[A]中,(n最大[A]!); \t \t else \t \t \t print nmin [a],nmax [a],a; \t} } – Dong 2013-05-07 02:43:34

+0

非常感谢! – Dong 2013-05-07 02:52:31

这一个班轮应该为你工作:

awk '!($2 in i){i[$2]=$1}{a[$2]=$1}END{for(x in i)print i[x],a[x],x}' file 

输出:

1.0 1.8 10 
1.9 2.9 20 
+0

非常好!感谢您的代码! – Dong 2013-05-06 14:50:05

+0

@东只是说,它会适用于您当前的输入(已排序)。但是,如果输入尚未排序,那么它将不起作用。 – anubhava 2013-05-06 15:06:01

+0

对,所以数据应该先排序。 – Dong 2013-05-07 01:14:34

我认为这应该工作:

{ read vStart int && 
while read vNext nextInt; do 
    if [ $int -ne $nextInt ]; then 
    echo "$vStart $v $int"; 
    vStart=$vNext; 
    fi 

    v=$vNext; 
    int=$nextInt; 
done && 
echo "$vStart $v $int"; } 
+0

工作正常,如果数据排序 – Dong 2013-05-07 02:47:48

+0

@东:对,但在原来的问题输入集已经排序(意外?) – knittl 2013-05-07 13:16:40

+0

是的,第二列也是未排序的事实上。 – Dong 2013-05-09 09:15:28

要添加另一种选择,你可以在R请勿这个问题,以及:

d.in <- read.table(file = commandArgs(trailingOnly = T)[1]); 
write.table(
    aggregate(V1 ~ V2, d.in, function (x) c(min(x),max(x)))[,c(2,1)] 
    , row.names = F 
    , col.names = F 
    , sep = "\t"); 

然后,只需调用这个脚本Rscript:现在

$ Rscript script.R data.txt 
1  1.8  10 
1.9  2.9  20