Como substituir a última ocorrência de um caractere?

0

Eu tenho um arquivo composto por linhas como estas:

199240050;0180209199240050;0
199240241;0180209199240241;0
199240207;0180209199240207;0
199240400;0180209199240400;0

Eu devo substituir o último número com "Ativo" se for "0" ou "Inativo" se for "1".

Eu tentei com sed , mas a ocorrência de "; 0" no meio da linha também foi alterada.

Ele deve ser usado em um script bash do Linux.

Eu tentei a solução dada pelo DopeGhoti mas ele falha:

$ sed 's/0$/active/;s/1$/inactive/'  myLines.txt
800600346                078136521                       active

Enquanto o formato do arquivo de entrada não deve mudar.

A segunda solução acrescenta "; ativo" no final, sem substituir:

$ awk -F\; 'BEGIN {OFS=";"} { if( $3 == 1 ) { print $1,$2,"inactive" } else { print $1,$2,"active" } }'  myLines.txt
800010654                0295445503                     0;;active

E George Vasiliou's também falha:

$ awk '$NF?$NF="active":$NF="inactive"' FS=';' OFS=';' myLines.txt
active
active
active
active
    
por mary 11.09.2017 / 19:46

3 respostas

8

Para os dados fornecidos em um arquivo chamado input :

$ awk -F\; 'BEGIN {OFS=";"} { if( $3 == 1 ) { print $1,$2,"inactive" } else { print $1,$2,"active" } }' input
199240050;0180209199240050;active
199240241;0180209199240241;active
199240207;0180209199240207;active
199240400;0180209199240400;active

Como alternativa, com sed :

$ sed 's/\;0$/active/;s/\;1$/inactive/' input
199240050;0180209199240050;active
199240241;0180209199240241;active
199240207;0180209199240207;active
199240400;0180209199240400;active
    
por 11.09.2017 / 19:50
4

Mais um awk, mais idiomático:

$ awk '$NF?$NF="inactive":$NF="active"' FS=';' OFS=';' file

Último campo $ NF é avaliado. Se for encontrado zero, o Último Campo $ NF é alterado para "ativo", caso contrário, é alterado para "inativo".

A impressão é omitida, pois será executada por padrão.

Alternativa, ainda mais idiomática usando a operação ternária na atribuição de variáveis:

$ awk '$NF=($NF?"inactive":"active")' FS=';' OFS=';' file
    
por 12.09.2017 / 02:17
0

com perl :

perl -pe 's/\d+(?!.*\d)/$& ? "Inactive" : "Active"/e' < file

Substitui a primeira seqüência de dígitos que não é seguida por nenhum dígito por "Inativo" se for 0 ou "Ativo".

    
por 19.09.2017 / 16:04