2013-03-27 98 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

相关问题