Bash脚本使用变量替换文本文件中的两个字段

时间:2013-03-27 05:58:56

标签: bash replace sed awk

这应该是一个简单的修复,但我现在无法绕过它。

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

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

2 个答案:

答案 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/" 诀窍是在模式中使用$来匹配行尾。 $$,因为有双引号。

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