Tente isto:
awk -F , '{ if ($3 == "xyz") $3="abc";}1' OFS=, test.csv
Como podemos pesquisar e substituir "xyz" apenas em col3?
col1,col2,col3,col4
abc,def,xyz,xyz
xyz,abc,def,xyz
Tente isto:
awk -F , '{ if ($3 == "xyz") $3="abc";}1' OFS=, test.csv
Você não mencionou com o que deseja substituí-lo, por isso vou usar ghi
como um marcador:
Se esse é o texto real, a maneira mais fácil é com sed
. Você pode fazer isso com awk
, mas isso só enviará a modificação para a saída padrão, enquanto sed
pode alterar o arquivo em si, que é explicado abaixo:
sed '2s|xyz|ghi|1' file
Para explicar:
2s replaces instances on the second line
xyz is what you want to replace
ghi is what it's being replaced with
1 replaces the first instance of it on the specified line
A saída:
col1,col2,col3,col4
abc,def,ghi,xyz
xyz,abc,def,xyz
Quando tiver certeza de que faz o que deseja, use a opção -i
para alterar o arquivo em si, em vez de enviá-lo para a saída padrão:
sed -i '2s|xyz|ghi|1' file
Se houver outras linhas e colunas nas quais você queira substituí-lo, será necessário modificar 2s
e 1
para especificar o (s) local (is) e a (s) instância (s). Obviamente, você também substituiria ghi
pelo substituto que quiser.
Se houver outras linhas na coluna 3 em que você precise substituir xyz
, poderá usar a opção e
. Por exemplo:
col1,col2,col3,col4
abc,def,xyz,xyz
xyz,abc,def,xyz
abc,def,xyz,abc
xyz
aparece na quarta linha da coluna 3 também.
sed -e '2s|xyz|ghi|1' -e '4s|xyz|ghi|1' file
sed -i -e '2s|xyz|ghi|1' -e '4s|xyz|ghi|1' file
Isso substituiria a primeira instância na quarta linha, além de usar -e
para especificar cada fluxo de substituições. A opção -i
altera o arquivo em vez de apenas enviá-lo para a entrada padrão.
awk -F ',' -v needle='xyz' -v replacement='foobar' 'BEGIN{ OFS = FS; } (NR > 1 && $3 == needle) { $3 = replacement; } 1' input.txt
Defina needle
e replacement
conforme necessário. NR > 1
garante que nenhuma substituição ocorra na primeira linha (aparentemente contendo os cabeçalhos da coluna).
Tags text-processing awk sed