2013-03-27 92 views
0

這應該是一個簡單的修復,但目前我無法將它包裹在它的周圍。Bash腳本使用變量替換文本文件中的兩個字段

我有一個逗號分隔的文件,名爲my_course,其中包含一些關於它們的信息的課程列表。

我需要得到有關最後兩個字段的用戶輸入並相應地更改它們。

每場構造,如: CourseNumber,CourseTitle,CreditHours,Status,Grade

示例文件:

CSC3210,COMPUTER ORG & PROGRAMMING,3,0,N/A 
CSC2010,INTRO TO COMPUTER SCIENCE,3,0,N/A 
CSC1010,COMPUTERS & APPLICATIONS,3,0,N/A 

我獲取用戶輸入的3件事情:Course NumberStatus (0 or 1),並且Grade (A,B,C,N/A)

到目前爲止,我已經嘗試匹配包含課程編號的行並更改最後兩個字段。我一直沒要弄清楚如何使用SED所以我使用的awk這個可怕的混亂修改的最後兩個字段和sed:

temporary=$(awk -v status=$status -v grade=$grade ' 
BEGIN { FS="," }; $(NF)=""; $(NF-1)=""; 
/'$cNum'/ {printf $0","status","grade;}' my_course) 

sed -i "s/CSC$cNum.*/$temporary/g" my_course 

我正在運行到這裏的問題是多少課程名稱中的字段範圍可以從1到4,因此我不能輕鬆打印前n個字段。我嘗試刪除最後兩個字段,並添加狀態和成績的新值,但這不適合我。

注意:我已經完成檢查以確保用戶輸入有效數據。

回答

0

不要緊,你在課程名稱多少逗號有,只要你在最後兩個逗號,只能看: sed -i "/CSC$cNum/ s/.,[^,]*$$/$status,$grade/" 的技巧是使用$在模式行的末尾匹配。由於雙引號引起的$$

而不要打擾建設「臨時」線 - 只適用於替換線路匹配課程編號。

1

使用簡單的awk腳本:

BEGIN { 
    FS="," 
    OFS=FS 
} 

$0 ~ course { 
    $(NF-1)=status 
    $NF=grade 
} {print} 

,並在CMD線,爲各種參數,如當然,地位和品位設置三個參數。

在行動:

$ cat input 
CSC3210,COMPUTER ORG & PROGRAMMING,3,0,N/A 
CSC2010,INTRO TO COMPUTER SCIENCE,3,0,N/A 
CSC1010,COMPUTERS & APPLICATIONS,3,0,N/A 

$ awk -vcourse="CSC3210" -vstatus="1" -vgrade="A" -f grades.awk input 
CSC3210,COMPUTER ORG & PROGRAMMING,3,1,A 
CSC2010,INTRO TO COMPUTER SCIENCE,3,0,N/A 
CSC1010,COMPUTERS & APPLICATIONS,3,0,N/A 

$ awk -vcourse="CSC1010" -vstatus="1" -vgrade="B" -f grades.awk input 
CSC3210,COMPUTER ORG & PROGRAMMING,3,0,N/A 
CSC2010,INTRO TO COMPUTER SCIENCE,3,0,N/A 
CSC1010,COMPUTERS & APPLICATIONS,3,1,B 
+0

+1的回答,但不要用全大寫爲您的變量名 - 這是對於像NR,OFS,文件名等 – 2013-03-27 14:08:15

+0

@EdMorton內置變量 - 你一如既往的正確!更新 – 2013-03-27 14:28:30

相關問題