bash:awk替换文件中的字符串

bash:awk替换文件中的字符串,bash,awk,Bash,Awk,我有一个基于文本的数据库文件,存储学生条目如下: SID:LNAME:FNAME:hw01:quiz01 004:dravid:rahul:78:100 002:ganguly:sourav:54:13 005:kohli:virat:48:43 001:kumble:anil::54 003:tendulkar:sachin:87:78 SID:LNAME:FNAME:hw01:quiz01 004:dravid:rahul:78:100 002:ganguly:sourav:54:13 0

我有一个基于文本的数据库文件,存储学生条目如下:

SID:LNAME:FNAME:hw01:quiz01
004:dravid:rahul:78:100
002:ganguly:sourav:54:13
005:kohli:virat:48:43
001:kumble:anil::54
003:tendulkar:sachin:87:78
SID:LNAME:FNAME:hw01:quiz01
004:dravid:rahul:78:100
002:ganguly:sourav:54:13
005:kohli:virat:48:43
001:kumble:anil:19:54
003:tendulkar:sachin:87:78
用户输入要更新的标题和学生的sid/lname/fname。例如,如果用户输入

sid=001,hw01,score=19,我希望输出如下:

SID:LNAME:FNAME:hw01:quiz01
004:dravid:rahul:78:100
002:ganguly:sourav:54:13
005:kohli:virat:48:43
001:kumble:anil::54
003:tendulkar:sachin:87:78
SID:LNAME:FNAME:hw01:quiz01
004:dravid:rahul:78:100
002:ganguly:sourav:54:13
005:kohli:virat:48:43
001:kumble:anil:19:54
003:tendulkar:sachin:87:78
我意识到awk是最好的方法。你知道怎么做吗


谢谢。

您可以使用此awk命令:

awk -v sid='001' -v hw01='19' 'BEGIN {FS=OFS=":"} $1 == sid { $4 = hw01 } 1' file
SID:LNAME:FNAME:hw01:quiz01
004:dravid:rahul:78:100
002:ganguly:sourav:54:13
005:kohli:virat:48:43
001:kumble:anil:19:54
003:tendulkar:sachin:87:78

更新:根据下面的注释,此awk命令接受搜索和更新列名和值

awk -v skey='SID' -v sval='001' -v ukey='hw01' -v uval='19' 'BEGIN { FS=OFS=":" }
       NR==1{for (i=1; i<=NF; i++) col[$i]=i} $col[skey]==sval{ $col[ukey]=uval } 1' file
SID:LNAME:FNAME:hw01:quiz01
004:dravid:rahul:78:100
002:ganguly:sourav:54:13
005:kohli:virat:48:43
001:kumble:anil:19:54
003:tendulkar:sachin:87:78
awk-vskey='SID'-vsval='001'-vukey='hw01'-vuval='19''开始{FS=OFS=“:”}

NR==1{(i=1;iI不想硬编码
$1和$4
。我希望这是基于用户输入。如果用户说lname:dravid和类似的quiz01=54怎么办?