Primeiro, se o arquivo em questão for /etc/passwd
, NÃO use essa solução; use usermod
.
Digamos que você queira converter o terceiro campo em newvalue2
para user007
. Você poderia fazer assim:
awk -F: -v OFS=: '$1 == "user007" {$3 = "newvalue2"} {print}' inputfile > outputfile
Se você quer definir especificamente uma função de shell para fazer isso, você pode (embora eu pessoalmente não me incomode.)
myfunc() {
[ "$#" -eq 2 ] ||
{ printf '%s\n' 'Usage: myfunc <USER> <GPA>' 'Assigns given GPA to USER (in column 5 of "~/students.dat")'
return 1;}
local mytempfile
mytempfile="$(mktemp)"
awk -F: -v OFS=: -v user="$1" -v gpa="$2" '$1 == user {$5 = gpa} {print}' ~/students.dat > "$mytempfile" &&
mv "$mytempfile" ~/students.dat
}
No entanto, isso NÃO é algo que eu faria para os dados REAL, apenas para dados temporários ou de "brinquedo" sem uso para ninguém além de mim. É muito mais frágil do que deveria ser. Os CSVs não são substitutos para um banco de dados adequado.
Se você optar por uma solução baseada em CSV, no mínimo certifique-se de ter backups regulares e MUITO melhor verificação de erros do que mostrado acima; por exemplo, você pode querer verificar a validade do nome de "usuário" fornecido ou lançar um erro se o usuário não for encontrado no arquivo CSV, ou fazer verificações de integridade de dados - como verificação de intervalo - no GPA fornecido. Mas todas essas coisas seriam melhor feitas com um banco de dados real.
Você pode configurar uma sandbox do PostgreSQL com muita facilidade e comece a brincar com ele para aprender mais sobre bancos de dados reais e o que você pode fazer com eles.