Awk - substitua um caractere apenas em uma determinada coluna


13

Eu tenho um arquivo como este:

2018.01.02;1.5;comment 1
2018.01.04;2.75;comment 2
2018.01.07;5.25;comment 4
2018.01.09;1.25;comment 7

Quero substituir todos os pontos .na segunda coluna por uma vírgula, ,como faria com sed 's/\./\,/g' filecomo posso usar sedou, de preferência, awkaplicar apenas isso à segunda coluna, para que minha saída fique assim:

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7

Respostas:


22
$ awk 'BEGIN{FS=OFS=";"} {gsub(/\./, ",", $2)} 1' ip.txt
2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
  • BEGIN{} esse bloco de código será executado antes de processar qualquer linha de entrada
  • FS=OFS=";" defina o separador de campos de entrada e saída como ;
  • gsub(/\./, ",", $2)para cada linha de entrada, substitua todo o .segundo campo por,
  • 1é um idioma awk para imprimir o conteúdo $0(que contém o registro de entrada)

1
incrível, muito THX!
Nath

9
sed 's/\./,/3' file

substituir a terceira ocorrência do ponto


2
Outro uso de Useles de cat... Por que não apenas sed 's/\./,/3' file? (Além disso, a vírgula não precisa ser escapado.)
twalberg

I levou em conta as observações
Emilio Galarraga

catnão seria necessariamente inútil aqui. Isso permitiria que a operação usasse 2 núcleos.
Ron rothman

@ronrothman, qual seria o objetivo da execução principal cat, além de consumir recursos? Talvez para fornecer um pouco de buffer, mas essa intenção deve ser melhor expressa por uma ferramenta como a bufferque cat.
Roland Illig 15/12/19

Para desacoplar as leituras do disco (bloqueando) da substituição da string. Sim, suponho que você possa pensar nisso como buffer.
Ron rothman

4

Feito pelo método abaixo usando awk

Comando: awk -F ";" '{gsub(/\./,",",$2);print $1";"$2";"$3}' filename

resultado

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.