需要设置一个函数来接收用户名、表中的位置以及要设置的新值。桌子组是
user:value1:value2:value3
我意识到如何使用进行替换awk '{gsub...
,但不知道如何在特定用户上指定它。
答案1
首先,如果有问题的文件是/etc/passwd
,不使用此解决方案;使用usermod
。
假设您想将第三个字段转换为newvalue2
for user007
。你可以这样做:
awk -F: -v OFS=: '$1 == "user007" {$3 = "newvalue2"} {print}' inputfile > outputfile
如果您特别想设置一个 shell 函数来执行此操作,则可以(尽管我个人不会打扰。)
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
}
然而,这不是我会为真实数据做的事情,仅用于临时或“玩具”数据,除了我之外对任何人都没有用。它比应有的脆弱得多。 CSV 不能替代适当的数据库。
如果您确实使用基于 CSV 的解决方案,至少要确保您有定期备份以及比上面所示更好的错误检查;例如,您可能想要检查所提供的“用户”名称的有效性,或者如果在 CSV 文件中找不到该用户则抛出错误,或者对所提供的 GPA 进行数据完整性检查(例如范围检查)。但所有这些事情最好使用实际的数据库来完成。
你可以设置 PostgreSQL 沙箱非常简单地并开始使用它来了解有关真实数据库以及可以用它们做什么的更多信息。