2015-06-27 3 views
3

У меня есть текст, основанный файл базы данных, в которой хранятся записи студента следующим образом:Баш: 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 

Пользователь вводит название, которое он хочет обновить и с.и.д./LName/FName ученика. Так, например, если пользователь вводит

с.и.д. = 001, hw01, оценка = 19, я хочу, выход следующим образом:

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 является лучшим способом сделать это. Любая идея, как это сделать?

Спасибо.

ответ

5

Вы можете использовать эту команду 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 

Update: Согласно комментариям ниже этой команды 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 
+0

Я не хочу жестко кодировать '$ 1 и $ 4'. Я хочу, чтобы это было основано на пользовательском вводе. что, если пользователь говорит lname: dravid и аналогично quiz01 = 54? –

+0

также проверьте мой обновленный ответ. – anubhava

3
$ cat tst.awk 
BEGIN { FS=OFS=":" } 
{ 
    if (NR==1) { 
     for (i=1; i<=NF; i++) { 
      name2num[tolower($i)] = i 
     } 
     # upd="sid=001,hw01=19" 
     split(tolower(upd),tmp,/[=,]/) 
     keyNum = name2num[tmp[1]] 
     keyVal = tmp[2] 
     tgtNum = name2num[tmp[3]] 
     tgtVal = tmp[4] 
    } 
    else { 
     if ($keyNum == keyVal) { 
      $tgtNum = tgtVal 
     } 
    } 
    print 
} 

.

$ awk -v upd="sid=001,hw01=19" -f tst.awk 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 -v upd="lname=dravid,quiz01=54" -f tst.awk file 
SID:LNAME:FNAME:hw01:quiz01 
004:dravid:rahul:78:54 
002:ganguly:sourav:54:13 
005:kohli:virat:48:43 
001:kumble:anil::54 
003:tendulkar:sachin:87:78