Eu tenho as seguintes linhas em um arquivo
$ cat test.txt
69|1074330570|1,sip:+121345633210x3Bverstat=TN-Validation-Passed|tel:+12134565534|0
69|1077822111|2,;tel:+2223120011~sip:[email protected];|sip:[email protected]|0
69|1077988012|1,sip:+121510016070x3Bverstat=TN-Validation-Passed|tel:+136965339510x3Bnpd|0
Quero substituir a terceira e a quarta colunas do arquivo apenas por números de telefone, da seguinte forma:
69|1074330570|2134563321|2134565534|0
69|1077822111|2223120011|3123120022|0
69|1077988012|2151001607|3696533951|0
A parte boa é que todos os arquivos terão um ‘+’ na terceira e quarta colunas. Agora, a parte difícil é que às vezes obtemos 11 dígitos, conforme observado na terceira coluna da primeira linha (121345633210) e às vezes não há '1' adicionado após um '+'. Portanto, se houver 1 após o sinal de mais, exclua 1. Caso contrário, inicie o comprimento após o sinal '+'. Da mesma forma, se houver 11 dígitos, apenas a substring 10. Além disso, se houver mais de 1 número como a linha 2, preciso pegar o primeiro número após o sinal '+' apenas como 2223120011 e não 2223120051.
Eu tentei o seguinte
awk -F"|" 'BEGIN {FS="+"}{print substr($3,2,10)}' test.txt
Mas está fornecendo um valor incorreto para a segunda linha, pois precisa começar após o sinal '+'.
Problemas com o código atual:
-F"|"
eFS="+"
ambos definem o delimitador do campo de entrada, portanto, tecnicamente, você deve escolher um ou outro, mas não ambos; neste casoFS="+"
tem precedência (ou seja,-F"|"
é ignorado)-F"|"
, mas também defini-lo como o delimitador do campo de saída (recomende:BEGIN { FS=OFS="|"}
awk
funções de string (por exemplo,split()
,match()
,index()
,substr()
)Suposições/Entendimentos:
+
+
é sempre um número de 10 ou 11 dígitos+
, estaremos interessados apenas no primeiro+
(por exemplo, não precisamos analisar mais com base emtel
orsip
)Uma
awk
ideia:NOTAS:
Isso gera:
Você pode usar esta
awk
solução:Com GNU awk para
gensub()
:ou com qualquer awk:
Com os exemplos mostrados, tente seguir
awk
o código GNU.Explicação: Adicionando explicação detalhada para o código acima.
awk
paramatch
usar regex nele, que cria grupos de captura e mais tarde podemos usá-los para obter a saída necessária.^([^|]*\|[^|]*\|)[^+]*\+1*([0-9]+)[^|]*(\|)[^+]*\+1*([0-9]+)[^|]*(\|.*$)
dentromatch
da função.0
pelo menos o segundo e o quarto grupo de captura usandosub
aqui.