두 열의 최소값과 최대값 찾기

두 열의 최소값과 최대값 찾기

아래와 같은 데이터가 있습니다.

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)
}

관련 정보