Encontre e substitua uma determinada posição por uma lista de valores

0

Eu tenho um arquivo com esse tipo de registro

DL2016-12-02P123456             PW5038               1234561180118       123456O00400010180421          0755480            HEALTH            B   NOT APPLICABLE                                    NOT APPLICABLE     2016-08-012016-12-022016-09-012016-08-312016-09-302016-09-012016-09-30949569014            PW5018             07554800010001089200001       00100010892                   00000010304MDIRECT    00000000000000000000{          HPS                           PW5018COCOAA007708200000010304DXQ7262016001      

Eu quero formatar o valor presente no campo 385-396 e 415-427 em cada linha. por exemplo, 00000010304M 000000000000{ Depois de usar este comando cut -c 385-396,415-427 --output-delimiter=" " file. Isso retornará 00000010304M 000000000000{ De acordo com um guia de referência M = -1 , { = +2 , N = +3 e assim por diante. Como você pode ver que os dados na posição 396 são M e os dados em 427 são { , os dados devem se parecer com -0000001030.41 e +00000000000.05 . Aqui M é substituído por -1 onde - o sinal é colocado no início e 1 no lugar M. Também um decimal é colocado antes de 2 lugar.

Last Character in Input Field|Positive or Negative|Last Number|Incoming Field|Value after replacement
{   +   0   12345{  1234.5
A   +   1   12345A  1234.51
B   +   2   12345B  1234.52
C   +   3   12345C  1234.53
D   +   4   12345D  1234.54
E   +   5   12345E  1234.55
F   +   6   12345F  1234.56
G   +   7   12345G  1234.57
H   +   8   12345H  1234.58
I   +   9   12345I  1234.59

}   -   0   12345}  -1234.5
J   -   1   12345J  -1234.51
K   -   2   12345K  -1234.52
L   -   3   12345L  -1234.53
M   -   4   12345M  -1234.54
N   -   5   12345N  -1234.55
O   -   6   12345O  -1234.56
P   -   7   12345P  -1234.57
Q   -   8   12345Q  -1234.58
R   -   9   12345R  -1234.59

Este arquivo está dizendo que se o número do campo 396 tiver M, use os dados da próxima coluna e substitua-os no arquivo atual. significa 00000010304M muda para -0000001030.44. você pode ver que o arquivo de referência mostra como M-4 12345M -1234.54. Por exemplo, a letra M a ser substituída, muda para 4 com um sinal - na frente que parece com -1234.54 agora no lugar de 12345M

    
por Abhishek Garg 13.09.2016 / 16:59

1 resposta

0

Você pode continuar quando começar com cut , mas dividi-lo em mais partes, quando necessário. Para se ter uma ideia, aqui está um pequeno snippet que converteria a primeira seção em cada linha.

cut -c 385-394,395,396 | \
while read integral dec suffix
do  case $suffix in
        '{');; # Nothing
        A) last=1;;
        B) last=2;;
        ...
        '}') sign=-;;
        J) sign=- last=1;;
        ...
    esac
    echo $sign$integral.$dec$last
done

Você tem a ideia. Expanda o cut para incluir também os campos do segundo número.

Se você quiser usar um arquivo separado com a tradução das letras finais, poderá usar grep desse arquivo em vez desta pesquisa inline.

    
por 15.09.2016 / 00:07