我有一些数据,如下所示:
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)
}