É muito complexo fazer isso com sed
. Uma ferramenta mais adequada é awk
ou bc
.
Por exemplo, para usar bc
, inclua outro sed
para converter a entrada em uma seqüência de expressões (10/1) e seqüências de caracteres ("") separadas por ";" ou newline resultando na seguinte entrada para bc:
10/1;" "; 10/1;" "; 1099/100
"N \n"
10/1;" "; 10/1;" "; 1088/100
"E \n"
bc
avaliará cada expressão e a saída será 10.00 10.00 10.99N 10.00 10.00 10.88E
conforme desejado. Aqui está o sed | bc | tr que você precisa:
sed '1i\
scale=2
/Ref: /s/.$/"& \n"/
s/.*: //
s/,/;" ";/g
' |
bc | tr -d '\n'
Como alternativa, usando awk
, você pode substituir todos os seus comandos sed
e tr
exatamente assim:
awk '
NF==4 { for(i=2;i<=4;i++){
split($i,x,"/")
printf "%s%g",i==2?"":" ",x[1]/x[2]
}
}
NF==2 { printf "%s%s",$2,$1~/Lat/?" ":"\n" }'
Isto procura por linhas com 4 campos (separados por espaço em branco) e para os campos 2 a 4 divide o campo $ i (digamos "1099/100") em 2 partes no caractere "/". Em seguida, ele imprime a parte 1 dividida pela parte 2 (x [1] / x [2]) usando o formato geral %g
para números. O %s
no printf
é substituído por nada para o campo 2 e por um espaço para os outros 2 campos. Isso separa os números na saída.
Para linhas com 2 campos (NF == 2), imprime o 2º campo ( $2
) e se o campo 1 contiver o padrão "Lat", imprime um espaço, ou seja, uma nova linha.