【问题标题】:Bash script replace two fields in a text file using variablesBash脚本使用变量替换文本文件中的两个字段
【发布时间】:2013-03-17 04:10:43
【问题描述】:

这应该是一个简单的解决方法,但我现在无法理解它。

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

注意:我已经进行了检查以确保用户输入的数据有效。

【问题讨论】:

    标签: bash replace sed awk


    【解决方案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
    

    【讨论】:

    • +1 作为答案,但不要使用全大写作为变量名 - 这是用于内置变量,如 NR、OFS、FILENAME 等。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2013-04-30
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2018-01-22
      相关资源
      最近更新 更多