找到两列中的最小值和最大值

找到两列中的最小值和最大值

我有一些数据,如下所示:

sampleA    ATGC    10   100
sampleA    ATGC    120  230
sampleA    ATGC    200  110

我想使用第 3 列和第 4 列中的值打印最小值和最大值。所以我的输出应如下所示:

sampleA   10  230

提前致谢

答案1

短的awk解决方案:

awk '{ a[++c]=$3; a[++c]=$4 }END{ asort(a); print $1,a[1],a[length(a)] }' file

输出:

sampleA 10 230

短的数据混合解决方案(用于第三/第四列内单独的最小/最大计算):

datamash -W -g1 min 3 max 4 < file
  • -g1- 按第一列值对记录进行分组

  • min 3- 获取第三列的最小值

  • max 4- 获取第四列的最大值

输出:

sampleA 10  230

答案2

使用awk

awk 'BEGIN{getline; min=$3;max=$4}
          {(min>$3)?min=$3:"";(max>$4)?"":max=$4}
     END{print min, max}' infile.txt

输出是:

10 230

但我猜您正在寻找类似下面的内容来查找 2 列中的最小值/最大值,而不是第三列中的最小值和第四列中的最大值,仅如上面所找到的那样。

输入示例:

sampleA    ATGC    10    100
sampleA    ATGC    300   2
sampleA    ATGC    200   1100
sampleA    ATGC    2301  9
sampleA    ATGC    12345 15
sampleA    ATGC    235   7

命令:

awk 'BEGIN{getline;min=max=$3;
           ($4>$3)?max=$4:min=$4} {
           ($3>$4 && min>$4)?min=$4:((min>$3)?min=$3:"");
           ($3>$4 && $3>max)?max=$3:((max<$4)?max=$4:"");
} END{print min, max}' infile.txt

输出将是:

2 12345

答案3

NF == 4 {
    if (++totalSamples == 1) {
        sampleName = $1
        minValue   = $3;
        maxValue   = $3;
    } else {
        if ($3 < minValue)
            minValue = $3
        else if ($3 > maxValue)
            maxValue = $3
    }
    if ($4 < minValue)
        minValue = $4
    else if ($4 > maxValue)
        maxValue = $4
}

END {
    if (totalSamples)
        printf("%s    %d   %d\n", sampleName, minValue, maxValue)
}

相关内容