0

CSV coma 区切りファイルから読み取る次のデータがあります。これには、 ID、名前、件名、Grade1、Grade2、Grade3、Grade4、Grade5、Final の8 つの列が含まれます。

データのサンプルを次に示します。

1,Allan Wilkinson,Calculo I,3.4,2.5,5,5,3.2
1,Allan Wilkinson,Calculo II,1,4.1,3.5,3.7,2.7
1,Allan Wilkinson,Fisica I,3,3.2,3.7,4.2,5
2,Rexanne Dickinson,Fisica II,4.3,3.4,2.5,5,3.5
2,Rexanne Dickinson,Estadistica,2.3,1,4.1,3.5,5
2,Rexanne Dickinson,Calculo I,3.4,2.5,5,3.7,3.5
3,Meaghan Neely,Calculo II,1,4.1,3.5,2.5,5
3,Meaghan Neely,Fisica I,3,3.2,3.7,4.1,3.5
3,Meaghan Neely,Fisica II,4.3,2.1,2.5,4.5,3.2
4,Ariana Donkin,Estadistica,1,4.1,4.3,2.1,2.5
4,Ariana Donkin,Calculo I,3,3.2,1,4.1,4.1
4,Ariana Donkin,Calculo II,3.4,3.2,1,4.1,3.2
5,Camron Jenner,Fisica I,2.1,2.5,5,2.5,2.5
5,Camron Jenner,Fisica II,4.1,4.1,3.5,4.1,4.3

ユーザーが新しい行を入力したり、現在の行を更新したり、データを CSV ファイルに保存したりできる Bash プログラムを作成しようとしています。

私が現在持っているコードは、要求されたデータを読み取って一致させ、新しいデータも要求します。私は awk を実装しようとしましたが、それを行う方法、または実際に仕事を達成できるかどうかはよくわかりません。

コードは次のとおりです。

echo "Enter the student ID";
read student;

while IFS=, read -r ID name subject grade1 grade2 grade3 grade4 grade5 finalg
do
if [[ $ID == $student ]]; then
echo "$subject $grade1 $grade2 $grade3 $grade4 $grade5 $finalg";
fi
done < grades.csv

echo "Enter Subject to Modify or Enter a New one to Add";
read modSubject;

echo "Enter Grade1";
read grade1new;

echo "Enter Grade2";
read grade2new;

echo "Enter Grade3";
read grade3new;

echo "Enter Grade4";
read grade4new;

echo "Enter Grade5";
read grade5new;

total=$(echo "$grade1new + $grade2new + $grade3new + $grade4new + $grade5new" | bc);
final=$(echo "scale=2; $total/5" | bc);

誰かが私を正しい方向に向けることができますか?ありがとう

4

1 に答える 1

0

あなたはほとんどそこにいました:-)

#!/bin/bash

echo "Enter the student ID";
read student;

while IFS=, read -r ID name subject grade1 grade2 grade3 grade4 grade5 finalg
do
    if [[ "$ID" = "$student" ]]; then
        echo "$subject $grade1 $grade2 $grade3 $grade4 $grade5 $finalg"
        snm="$name"  # <-we need the name so we store it here, safe 
    fi
done < grades.csv

echo "Enter Subject to Modify or Enter a New one to Add"; read modSubject;
echo "Enter Grade1"; read grade1new;
echo "Enter Grade2"; read grade2new;
echo "Enter Grade3"; read grade3new;
echo "Enter Grade4"; read grade4new;
echo "Enter Grade5"; read grade5new;

total=$(echo "$grade1new + $grade2new + $grade3new + $grade4new + $grade5new" | bc);
final=$(echo "scale=2; $total/5" | bc);

#drop the old record
grep -v "^$student,$snm,$modSubject," grades.csv >tmp$$

#add the new record
echo "$student,$snm,$modSubject,$grade1new,$grade2new,$grade3new,$grade4new,$grade5new,$final" >>tmp$$ 
mv tmp$$ grades.csv

たった 2 つの小さな変更で十分でした。1 つ目は、名前が必要なため、while ループの小さな変更です。最後に、古いレコード (存在する場合) を削除し、新しいレコードを追加します。出力はソートされていません。並べ替えたい場合はsort grades.csv -o grades.csv、最後に追加してください。

確かに少し最適化できますが、コードをあまりいじりたくありませんでした:-)

于 2013-11-12T04:25:15.323 に答える