0

这应该是一个简单的解决方法,但目前我无法完全理解它。

我有一个名为的逗号分隔文件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 个字段。我尝试删除最后两个字段并附加状态和等级的新值,但这对我不起作用。

注意:我已经完成检查以确保用户输入有效数据。

4

2 回答 2

1

使用一个简单的 awk 脚本:

BEGIN {
  FS=","
  OFS=FS
}

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

并在命令行上,为课程、状态和成绩等各种参数设置三个参数。

在行动:

$ 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
于 2013-03-27T10:14:29.760 回答
0

只要您只看最后两个逗号,课程名称中有多少逗号并不重要: sed -i "/CSC$cNum/ s/.,[^,]*$$/$status,$grade/" 诀窍是$在模式中使用以匹配行尾。$$因为双引号。

并且不要费心构建“临时”行 - 仅将替换应用于与课程编号匹配的行。

于 2013-03-27T06:14:36.130 回答