아래와 같은 데이터가 있습니다.
sampleA ATGC 10 100
sampleA ATGC 120 230
sampleA ATGC 200 110
3열과 4열의 값을 이용하여 최소값과 최대값을 출력하고 싶습니다. 따라서 내 출력은 다음과 같아야 합니다.
sampleA 10 230
미리 감사드립니다
답변1
짧은앗해결책:
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
하지만 위에서 찾은 것처럼 3번째 열의 최소값과 4번째 열의 최대값 대신 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)
}