不同列中相同值的最小和最大坐标

时间:2014-07-10 13:15:38

标签: bash awk sed

我有一个问题,我想我的数据的脚本,我完全迷失了。

INPUT:

 1          BR.100.200

 2          BR.100.200

 3          BR.100.200

 4          BR.100.200

 1          BAL.11.235

 2          BAL.11.235

 3          BAL.11.235

 1          JOJ.21.354

 2          JOJ.21.354

输出:

BR.100.200     1     4

BAL.11.235     1     3

JOJ.21.354     1     2

比我想要的:如果$ 2对于列是相同的,则为$ 1中的相同值maximal和minimal值写入。请我更喜欢awk语言或bash或sed。 谢谢 菲利普

3 个答案:

答案 0 :(得分:2)

可以做得更好,但这有效吗

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

更具可读性

awk '!min[$2]{min[$2]=$1} max[$2]<$1{max[$2]=$1} min[$2]>$1{min[$2]=$1} END{for(i in max)print i, min[i], max[i]}' file

答案 1 :(得分:1)

#!/usr/bin/awk -f

NF == 0 { next }
$2 in min {
    if ($1 < min[$2]) {
        min[$2] = $1
    } else if ($1 > max[$2]) {
        max[$2] = $1
    }
    next
}
{
    min[$2] = max[$2] = $1
    keys[i++] = $2
}
END {
    for (i = 0; i in keys; ++i) {
        key = keys[i]
        if (i) {
            print ""
        }
        printf "%s\t%s\t%s\n", key, min[key], max[key]      
    }
}

使用以下命令运行:

awk -f script.awk your_file.txt

输出:

BR.100.200      1       4

BAL.11.235      1       3

JOJ.21.354      1       2

答案 2 :(得分:0)

awk '{if (NR == 1) {temp1=$2;min=$1;max=$1;} else if ((NR % 2)!=0) {temp2=$2; if (temp1 == temp2) {max=$1} else {print (temp1,min,max); temp1=$2;min=$1;max=$1} } } END{if ((NR % 2)!=0) {temp2=$2; if (temp1 == temp2) {max=$1} else {print (temp1,min,max);} print (temp2,min,max) } }' inputfile