这应该是一个简单的修复,但我现在无法绕过它。
我有一个名为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 Number
,Status (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 :(得分:1)
使用简单的awk脚本:
BEGIN {
FS=","
OFS=FS
}
$0 ~ course {
$(NF-1)=status
$NF=grade
} {print}
并在cmd-line上,为各种参数设置三个参数,如课程,状态和成绩。
行动中:
$ 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
答案 1 :(得分:0)
只要你只查看 last 两个逗号,你在课程名称中有多少逗号并不重要:
sed -i "/CSC$cNum/ s/.,[^,]*$$/$status,$grade/"
诀窍是在模式中使用$
来匹配行尾。 $$
,因为有双引号。
并且不打算构建“临时”行 - 仅将替换应用于与课程编号匹配的行。