encontre o valor min e max em duas colunas

0

Eu tenho alguns dados que parecem:

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

Eu quero imprimir o min e max usando os valores nas colunas 3 e 4. Assim, minha saída deve se parecer com:

sampleA   10  230

Obrigado antecipadamente

    
por AudileF 09.08.2017 / 13:46

3 respostas

2

Usando awk :

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

A saída é:

10 230

Mas eu acho que você está procurando algo como abaixo para encontrar min / max dentro de 2Columns não min na 3ª coluna e max na 4ª coluna somente como acima está encontrando.

Entrada de amostra:

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

O comando:

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

A saída seria:

2 12345
    
por 09.08.2017 / 14:09
2

Solução awk curta:

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

A saída:

sampleA 10 230

Solução datamash (para min / min separados cálculo máximo dentro da 3ª / 4ª colunas):

datamash -W -g1 min 3 max 4 < file
  • -g1 - registros de grupos pelo valor da primeira coluna

  • min 3 - obtenha o valor mínimo na terceira coluna

  • max 4 - obtenha o valor máximo na 4ª coluna

A saída:

sampleA 10  230
    
por 09.08.2017 / 14:13
0
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)
}
    
por 09.08.2017 / 23:07