Max da segunda coluna e Min da primeira coluna, comparando duas linhas de cada vez

0
5500 5700
5600 5800
5700 5800
5600 5900
5900 6100
5900 6100
5900 6100
5800 6000
5800 6100
5900 6100
5800 6200
5700 5800

Eu tenho um arquivo com duas colunas como acima. Eu preciso descobrir min de cada duas linhas na primeira coluna e no máximo de cada duas linhas na segunda coluna.Como isso pode ser conseguido usando o awk? Saída desejada seria

Min      Max
5500     5800
5600     5900
5900     6100
5800     6100
5800     6100
5700     6200  
    
por firefoxix 16.05.2017 / 10:44

2 respostas

1
$ awk 'BEGIN { print "Min", "Max" } {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min Max
5500 5800
5600 5900
5900 6100
5800 6100
5800 6100
5700 6200

O código awk salva os valores atuais na coluna um e dois nas variáveis a e b , respectivamente. Em seguida, ele lê a próxima linha explicitamente e imprime o mínimo de a e o novo valor na coluna um junto com o máximo de b e o novo valor da coluna dois.

($1 < a ? $1 : a) está usando o operador ternário ?: para fazer uma comparação e escolher um valor, dependendo do resultado dessa comparação.

Se você quiser uma saída delimitada por tabulações:

$ awk 'BEGIN {OFS="\t"; print "Min", "Max"} {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min     Max
5500    5800
5600    5900
5900    6100
5800    6100
5800    6100
5700    6200
    
por 16.05.2017 / 11:18
0
perl -pe '($_ .= <>) =~ s/(\d+) (\d+)\n(\d+) (\d+)/($3<$1 ? $3:$1).$".($4>$2 ? $4:$2)/e'

Anexe a linha seguinte no registro atual $_ e compare os campos 3 < - > 1 para min e 4 < - > 2 para max e coloque os resultados dentro do próprio registro. -p carregará o resultado para stdout depois disso.

    
por 16.05.2017 / 11:40