Eu tenho o seguinte arquivo (test.txt) que desejo alterar a lógica da seguinte forma:
0 becomes 1
1 becomes 2
2 becomes 3
3 becomes 4
4 becomes 5
5 becomes 6
6 becomes 7
7 becomes 8
8 becomes 9
9 becomes 0
$ cat test.txt
69|1074330570|1,sip:+121345633210x3Bverstat=TN-Validation-Passed|tel:+12134565534|0
69|1077822111|2,;tel:+12223120011~sip:[email protected];|sip:[email protected]|0
Quero alterar os últimos 4 dígitos, mas quando x está próximo a 0x, 0 não conta. Por exemplo: na primeira linha '+121345633210x', os 4 últimos são 3321. Na segunda linha, '+12223120011', os 4 últimos são 0011 e '+12223120051', os 4 últimos são 0051 A saída deve ser a seguinte:
69|1074330570|1,sip:+121345644320x3Bverstat=TN-Validation-Passed|tel:+12134566645|0
69|1077822111|2,;tel:+12223121122~sip:[email protected];|sip:[email protected]|0
É necessário excluir '+1' e depois contar '10' dígitos nos quais desejo substituir os 4 últimos na terceira e quarta colunas.
121345633210 becomes 121345644320 / 12134565534 becomes 12134566645
12223120011 becomes 12223121122 / 12223120051 becomes 12223121162 / 13123120022 becomes 13123121133
Usei a lógica abaixo quando a coluna é apenas um número. Mas neste caso, tem outras coisas, então a lógica abaixo não está funcionando, mas é correto converter números adicionando 1 dígito.
awk -F"|" -v OFS="|" '
NR>0 {
for (i=3;i<=4;i++) {
str = substr($i, 1, length($i) - 4)
for (j = length($i) - 3; j <= length($i); j++) {
str = str (substr($i, j, 1) + 1) % 10
}
$i = str
}
}
1'
Usando
gnu-awk
, você pode fazer isso:Premissas:
+
aparece apenas nos 3º/4º campos e somente na frente de um número de telefoneUma
awk
abordagem:Isso gera:
Usando GNU awk para o terceiro argumento para corresponder():
Isso produz a saída esperada sem testar apenas o terceiro ou quarto campo e sem testar
0x
porque não há strings em campos diferentes de 3 ou 4 que correspondam ao regexp de destino e, embora você tenha dito ignorar0
seguido porx
, na realidade você está simplesmente sempre alterando os primeiros 11 dígitos e qualquer um0
que seja seguidox
será o 12º dígito.Você poderia fazer o mesmo usando qualquer awk POSIX com: