Calcular intervalos

3

Como explicitar os intervalos entre valores numéricos em um arquivo? (melhor se for um one-liner awk)

Entrada:

A    1-3
B    5-7

Saída

A    1,2,3
B    5,6,7

Código que tentei até agora:

sed -i 's/-/\t/g' input #splits the digits to separated columns

awk '{print$1"\t"$3-$2+1}' input > output #prints key and interval width

Mas, só permite calcular o número de valores dentro do intervalo. Por exemplo, a saída será semelhante a:

A    3
B    3
    
por dovah 16.07.2014 / 12:31

1 resposta

2

Pessoalmente, eu faria isso tirando proveito da expansão de chaves do shell:

$ while read a b; do echo $a $(eval echo {"$(sed 's/-/../' <<<$b)"}); done < file
A 1 2 3
B 5 6 7

ou, para ter valores separados por vírgulas

$ while read a b; do 
    echo $a $(eval echo {"$(sed 's/-/../' <<<$b)"} | sed 's/ /,/g'); 
  done < file
A 1,2,3
B 5,6,7

Desde que você pediu um forro awk one, você poderia tentar:

$ sed 's/-/ /' file | 
    awk '{printf "%s ", $1; for(i=$2;i<=$NF-1;i++){printf "%d,", i}; print $NF}' 
A 1,2,3
B 5,6,7

ou, para fazer tudo no awk:

$ awk '{gsub(/-/," ")}{printf "%s ", $1; 
                       for(i=$2;i<=$NF-1;i++){printf "%d,", i}; print $NF}' file
A 1,2,3
B 5,6,7
    
por 16.07.2014 / 14:14

Tags