Este simples awk
:
awk -F"|" '{OFS="|"}$2=$2*1' file
OFS
define o separador do campo de saída. $2=$2*1
apenas multiplica o segundo campo com 1
; o zero inicial desaparece.
Eu tenho o arquivo com a próxima estrutura:
999963803|081439403|FFF|33
999964211|081823904|FFF|33
999970948|081765738|FFF|33
999971835|081736346|FFF|33
999972780|082127527|FFF|33
Eu preciso remover o primeiro caractere na segunda coluna,
Eu tento com sed "s/|.1|/^.\(.*\)//" my_file.txt
, mas não funciona, o resultado deve ser:
999963803|81439403|FFF|33
999964211|81823904|FFF|33
999970948|81765738|FFF|33
999971835|81736346|FFF|33
999972780|82127527|FFF|33
com awk:
awk -F"|" '{print $1"|"substr($2,2)"|"$3"|"$4}' <test
Com o POSIX sed:
sed -e 's/[^|]\([^|]*|\)//2' <file
O regex [^|][^|]*|
significa uma ou mais sequências de caracteres, exceto |
, portanto, ele corresponderá a cada um dos campos, exceto o último, você precisa de [^|][^|]*$
para corresponder ao último campo. O comando 2
modifier made s
ubstitute só faz a substituição para a segunda correspondência, que é o segundo campo.
Com o GNU ou o BSD sed, você pode simplificar a sintaxe para:
sed -E 's/[^|]([^|]*|)//2' <file
Por que tão complexo?
É o primeiro caractere após o primeiro |
, então ...
sed <filename -e 's/|./|/'
... Deveria trabalhar.
Ou seja, encontre o primeiro |
e inclua o caractere após ele, substitua apenas por |
.
por exemplo:
$ sed <my_file.txt -e 's/|./|/' 999963803|81439403|FFF|33 999964211|81823904|FFF|33 999970948|81765738|FFF|33 999971835|81736346|FFF|33 999972780|82127527|FFF|33
Observação: adicione /g
no final para substituir todas as ocorrências, não apenas a primeira.
Tags text-processing awk sed