Você quer o awk. Na minha opinião, quase nunca há qualquer razão para usar o sed sobre o awk, para qualquer outra coisa além de substituições triviais (não muito mais complexas do que sed -e 's/this/that'
). Neste caso, é particularmente contraproducente.
Você pode dizer ao awk para usar, como um separador, usando -F,
. Também podemos colocar uma vírgula na variável OFS
do awk (separador de campo de saída) para que o comando print
, que combina novamente os campos posicionais, os combine com uma vírgula:
awk -F, 'BEGIN { OFS="," } ...'
Agora vamos nos ater à lógica. O Awk suporta um tipo de "programação reativa", na medida em que permite a atribuição às variáveis de campo posicionais $1
, $2
, ... Quando você atribui a qualquer uma delas, reconstitui automaticamente a variável $0
que originalmente contém a linha de entrada. Ele reconstitui combinando os campos posicionais, com OFS
entre eles. Assim, podemos fazer:
awk -F, 'BEGIN { OFS="," }
{ if ($6 == 1) $6 = "Cos4"
else if ($6 == 2) $6 = "Cos6"
print }' yourfile
Não é necessário regexing; Se você revisitar isso seis meses depois, será quase instantaneamente óbvio o que ele faz.
O código acima pode ser simplificado um pouco, fatorando os testes condicionais em regras awk individuais. Isso é para dizer:
awk -F, 'BEGIN { OFS="," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
{ print }' yourfile
Além disso, podemos "codificar golf" o { print }
substituindo-o por um 1
:
awk -F, 'BEGIN { OFS="," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
1' yourfile
A constante 1
serve como uma condição booleana. A condição não tem ação, portanto, o Awk fornece uma ação padrão que é { print }
. Entretanto, agora, se você revisitar isso seis meses depois, terá que lembrar disso; encurtar os programas desta maneira, por vezes, cria dívida futura.
Por outro lado, uma boa transformação, já que estamos definindo OFS
no bloco BEGIN
, é evitar a opção -F
e apenas definir FS
no mesmo bloco:
awk 'BEGIN { FS = OFS = "," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
{ print }' yourfile
Podemos usar uma tarefa composta, muito parecida com a linguagem C. Coisas semelhantes, relacionadas, devem ser feitas juntas de maneira semelhante, se possível.