Adiciona valor em um campo para uma determinada condição na coluna específica do arquivo

0

Eu preciso do prefixo digito 9 para a segunda coluna do arquivo quando o valor da segunda coluna começar com 10 e tamanho da segunda coluna for 8 Exemplo

file.txt

T01|10017516|01|ABCD|1203|EFGH   
T01|10905704|01|ABCD|1203|EFGH           
T01|550007656|02|ABCD|1203|EFGH     
T01|550007657|01|ABCD|1203|EFGH      
T01|10190570|01|ABCD|1203|EFGH                             
T01|950007659|01|ABCD|1203|EFGH           
T01|950007657|01|ABCD|1203|EFGH           
T01|10473696|01|ABCD|1203|EFGH  
T01|850007651|01|ABCD|1203|EFGH

O resultado deve ser:

T01|910017516|01|ABCD|1203|EFGH  
T01|910905704|01|ABCD|1203|EFGH  
T01|550007656|02|ABCD|1203|EFGH  
T01|550007657|01|ABCD|1203|EFGH  
T01|910190570|01|ABCD|1203|EFGH  
T01|950007659|01|ABCD|1203|EFGH  
T01|950007657|01|ABCD|1203|EFGH   
T01|910473696|01|ABCD|1203|EFGH  
T01|850007651|01|ABCD|1203|EFGH
    
por Miguel Angel 18.08.2016 / 23:52

2 respostas

1

Solução usando perl e GNU sed

perl -pe 's/^[^|]*\|\K(10\d{6}\|)/9$1/' file.txt

sed -r 's/^([^|]*\|)(10[0-9]{6}\|)//' file.txt

Em ambos os casos, você pode adicionar -i.bkp para alterar o arquivo no local e copiar o arquivo original para file.txt.bkp ou apenas -i se o backup não for necessário

Editar:

Obrigado @drg por apontar um erro no perl one-liner .. ^.*?\| não garantiria a correspondência da segunda coluna. Por exemplo, ab|asd|10017516|asd seria erroneamente alterado

    
por 19.08.2016 / 06:07
1

O seguinte deve funcionar (e espero que não precise de explicação)

awk -F'|' -vOFS='|' '$2 ~ /^10/ && length($2) == 8{$2="9"$2}; {print}' file.txt
    
por 19.08.2016 / 00:45