0

これは簡単な修正であるはずですが、現時点では頭を悩ませることはできません。

と呼ばれるコンマ区切りのファイルmy_courseがあり、コースのリストとそれらに関する情報が含まれています。

最後の 2 つのフィールドについてユーザー入力を取得し、それに応じて変更する必要があります。

各フィールドは次のように構成されます。 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

Course NumberStatus (0 or 1)、およびの 3 つの項目に対するユーザー入力を取得します。Grade (A,B,C,N/A)

これまでのところ、コース番号を含む行を照合し、最後の 2 つのフィールドを変更しようとしました。sed を使用して最後の 2 つのフィールドを変更する方法を理解しようとしていなかったので、この恐ろしいごちゃ混ぜの 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 つのフィールドを削除して、ステータスとグレードの新しい値を追加しようとしましたが、うまくいきません。

注: ユーザーが有効なデータを入力したことを確認するために、既にチェックを行っています。

4

2 に答える 2

1

シンプルな awk スクリプトを使用します。

BEGIN {
  FS=","
  OFS=FS
}

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

コマンドラインで、コース、ステータス、グレードなどのさまざまなパラメーターに 3 つのパラメーターを設定します。

実際に:

$ 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

最後の2 つのコンマ だけを見れば、コース名にいくつのコンマがあってもかまいませんsed -i "/CSC$cNum/ s/.,[^,]*$$/$status,$grade/" 。秘訣は、$in pattern を使用して行末に一致させることです。$$二重引用符のため。

また、「一時的な」行をわざわざ作成しないでください - コース番号に一致する行にのみ置換を適用してください。

于 2013-03-27T06:14:36.130 に答える