我有一個 Bash 專案,我需要一種計算學生平均值并將這些平均值添加到文本檔案中的方法。文本檔案如下:
:NOM Prenom:CODE :.Tp1 :.Intra:.Tp2 :.Tp3 :.Final :.TP4 :.Moy:.Lettre:
actarusx:Actarus :ACTA28658105 : 45.5: 75.00:100.0: 95.0: 48.50: 90.0:
alcorxxx:Alcor :ALCO18083408 : 83.0: 64.75: 95.0: 87.5: 74.00: 97.0:
venusiax:Venusia :VENU13097708 : 83.0: 55.00: 95.0: 87.5: 41.50: 97.0:
phenicia:Phenicia :PHEN14100790 : 94.0: 50.50: 95.0: 95.0: 59.50: 99.0:
mizarxxx:Mizar :MIZA22128106 : 98.0: 95.50: 95.0:100.0: 80.50: 90.0:
procyonx:Procyon :PROC01033701 : 99.0: 99.50:100.0: 95.0: 98.00:100.0:
flamxxxx:Flam :FLAM26077904 : 89.0: 37.25: 97.5: 87.5: 63.50: 97.0:
johannxx:johann :JOHA23058000 : 94.0: 99.25:100.0: 95.0: 36.00:100.0:
wrightxx:Wright :WRIG21058103 : 99.0: 100.0:100.0:100.0: 100.0: 97.0:
cragxxxx:Grag :CRAG05018002 : 99.0: 90.00: 90.0:100.0: 97.00: 99.0:
malaxxxx:Mala :MALA09557914 : 96.0: 69.50:100.0:100.0: 34.00: 47.0:
我想計算 TP1,2,3,4, Intra 和 Final 的總平均值。一旦我得到每個學生的平均值(每行一個學生),我想在名為 Moy 的列下添加平均值:。注意:由于某種原因,所有類別都移動了,因此第一行浮點數與 tp1 相關聯,依此類推。
目前我有:
nbline=0
while read line; do
if[ $nbline -eq 0 ]; then #To skip the first line with each categories
let nbline =1
else
# Code that allows me to get the grades for each categories (already provided by the teacher)
# eg. for the first student the code will do tp1=45.5, intra=75, etc...
# Code that allows me to calculate the average (already provided by the teacher)
# moy is the average found
找到 moy 后,我不知道如何將其添加到 Moy:每個學生的列中。這是我第一次在 unix/linux 中編碼,我的老師并沒有花很多時間(如果有的話)教我們不同的命令,因此將不勝感激。
非常感謝
uj5u.com熱心網友回復:
簡單就是好
λ cat input.txt
:NOM Prenom:CODE :.Tp1 :.Intra:.Tp2 :.Tp3 :.Final :.TP4 :.Moy:.Lettre:
actarusx:Actarus :ACTA28658105 : 45.5: 75.00:100.0: 95.0: 48.50: 90.0:
alcorxxx:Alcor :ALCO18083408 : 83.0: 64.75: 95.0: 87.5: 74.00: 97.0:
venusiax:Venusia :VENU13097708 : 83.0: 55.00: 95.0: 87.5: 41.50: 97.0:
phenicia:Phenicia :PHEN14100790 : 94.0: 50.50: 95.0: 95.0: 59.50: 99.0:
mizarxxx:Mizar :MIZA22128106 : 98.0: 95.50: 95.0:100.0: 80.50: 90.0:
procyonx:Procyon :PROC01033701 : 99.0: 99.50:100.0: 95.0: 98.00:100.0:
flamxxxx:Flam :FLAM26077904 : 89.0: 37.25: 97.5: 87.5: 63.50: 97.0:
johannxx:johann :JOHA23058000 : 94.0: 99.25:100.0: 95.0: 36.00:100.0:
wrightxx:Wright :WRIG21058103 : 99.0: 100.0:100.0:100.0: 100.0: 97.0:
cragxxxx:Grag :CRAG05018002 : 99.0: 90.00: 90.0:100.0: 97.00: 99.0:
malaxxxx:Mala :MALA09557914 : 96.0: 69.50:100.0:100.0: 34.00: 47.0:
awk -F: 'NR==1;NR>1{print $0 ($4 $5 $6 $7 $8 $9)/6}' input.txt
:NOM Prenom:CODE :.Tp1 :.Intra:.Tp2 :.Tp3 :.Final :.TP4 :.Moy:.Lettre:
actarusx:Actarus :ACTA28658105 : 45.5: 75.00:100.0: 95.0: 48.50: 90.0: 75.6667
alcorxxx:Alcor :ALCO18083408 : 83.0: 64.75: 95.0: 87.5: 74.00: 97.0: 83.5417
venusiax:Venusia :VENU13097708 : 83.0: 55.00: 95.0: 87.5: 41.50: 97.0: 76.5
phenicia:Phenicia :PHEN14100790 : 94.0: 50.50: 95.0: 95.0: 59.50: 99.0: 82.1667
mizarxxx:Mizar :MIZA22128106 : 98.0: 95.50: 95.0:100.0: 80.50: 90.0: 93.1667
procyonx:Procyon :PROC01033701 : 99.0: 99.50:100.0: 95.0: 98.00:100.0: 98.5833
flamxxxx:Flam :FLAM26077904 : 89.0: 37.25: 97.5: 87.5: 63.50: 97.0: 78.625
johannxx:johann :JOHA23058000 : 94.0: 99.25:100.0: 95.0: 36.00:100.0: 87.375
wrightxx:Wright :WRIG21058103 : 99.0: 100.0:100.0:100.0: 100.0: 97.0: 99.3333
cragxxxx:Grag :CRAG05018002 : 99.0: 90.00: 90.0:100.0: 97.00: 99.0: 95.8333
malaxxxx:Mala :MALA09557914 : 96.0: 69.50:100.0:100.0: 34.00: 47.0: 74.4167
解釋
-F:設定:為欄位分隔符- 缺少
{ action }意味著列印該行。例如,以下命令是相同的:awk '1{ print $0 }awk '1{ print }awk '1'
- 這里我們使用
1作為模式條件。awk將非空字串和非零數字視為true. 例如,以下命令是相同的:awk '1'awk '"foo"'
awk連接由空格表示,因此print $0 ($4 $5 $6 $7 $8 $9)/6將列印整個記錄$0,后跟($4 $5 $6 $7 $8 $9)/6.
uj5u.com熱心網友回復:
請您嘗試以下方法:
#!/bin/bash
while read -r line; do
if (( nr == 0 )); then # header line
echo "$line"
else
mapfile -d: -t a <<< "$line" # assign array "a" to the columns
ave=$(echo "scale=2; ( $(IFS= ; echo "${a[*]:3:6}") ) / 6" | bc)
printf "%s%6s\n" "$line" "$ave"
fi
done < file.txt
輸出:
:NOM Prenom:CODE :.Tp1 :.Intra:.Tp2 :.Tp3 :.Final :.TP4:.Moy:.Lettre:
actarusx:Actarus :ACTA28658105 : 45.5: 75.00:100.0: 95.0: 48.50: 90.0: 75.66
alcorxxx:Alcor :ALCO18083408 : 83.0: 64.75: 95.0: 87.5: 74.00: 97.0: 83.54
venusiax:Venusia :VENU13097708 : 83.0: 55.00: 95.0: 87.5: 41.50: 97.0: 76.50
phenicia:Phenicia :PHEN14100790 : 94.0: 50.50: 95.0: 95.0: 59.50: 99.0: 82.16
mizarxxx:Mizar :MIZA22128106 : 98.0: 95.50: 95.0:100.0: 80.50: 90.0: 93.16
procyonx:Procyon :PROC01033701 : 99.0: 99.50:100.0: 95.0: 98.00:100.0: 98.58
flamxxxx:Flam :FLAM26077904 : 89.0: 37.25: 97.5: 87.5: 63.50: 97.0: 78.62
johannxx:johann :JOHA23058000 : 94.0: 99.25:100.0: 95.0: 36.00:100.0: 87.37
wrightxx:Wright :WRIG21058103 : 99.0: 100.0:100.0:100.0: 100.0: 97.0: 99.33
cragxxxx:Grag :CRAG05018002 : 99.0: 90.00: 90.0:100.0: 97.00: 99.0: 95.83
malaxxxx:Mala :MALA09557914 : 96.0: 69.50:100.0:100.0: 34.00: 47.0: 74.41
mapfile -d: -t a <<< "$line"在冒號上拆分輸入行并將陣列分配a給列。$(IFS= ; echo "${a[*]:3:6}")輸出由符號分隔的第 4 到第 9 列,以便bc命令可以計算列的總和。- 如果要調整平均值的小數位數,請將值修改為和格式中
-scale=2的寬度。%6sprintf
uj5u.com熱心網友回復:
LC_ALL="C"
start_col=4
end_col=9
output_col=10
delimiter=":"
awk \
-F"$delimiter" \
-v "start=$start_col" \
-v "end=$end_col" \
-v "output=$output_col" '
BEGIN {OFS = FS}
NR == 1 { print }
NR !=1 {
sum=0
for (i=start; i<=end; i ) sum=sum $i
$(output)=" "sprintf("%.2f", sum/((end 1)-start))
print
}' file.txt
輸出:
:NOM Prenom:CODE :.Tp1 :.Intra:.Tp2 :.Tp3 :.Final :.TP4 :.Moy:.Lettre:
actarusx:Actarus :ACTA28658105 : 45.5: 75.00:100.0: 95.0: 48.50: 90.0: 75.67
alcorxxx:Alcor :ALCO18083408 : 83.0: 64.75: 95.0: 87.5: 74.00: 97.0: 83.54
venusiax:Venusia :VENU13097708 : 83.0: 55.00: 95.0: 87.5: 41.50: 97.0: 76.50
phenicia:Phenicia :PHEN14100790 : 94.0: 50.50: 95.0: 95.0: 59.50: 99.0: 82.17
mizarxxx:Mizar :MIZA22128106 : 98.0: 95.50: 95.0:100.0: 80.50: 90.0: 93.17
procyonx:Procyon :PROC01033701 : 99.0: 99.50:100.0: 95.0: 98.00:100.0: 98.58
flamxxxx:Flam :FLAM26077904 : 89.0: 37.25: 97.5: 87.5: 63.50: 97.0: 78.62
johannxx:johann :JOHA23058000 : 94.0: 99.25:100.0: 95.0: 36.00:100.0: 87.38
wrightxx:Wright :WRIG21058103 : 99.0: 100.0:100.0:100.0: 100.0: 97.0: 99.33
cragxxxx:Grag :CRAG05018002 : 99.0: 90.00: 90.0:100.0: 97.00: 99.0: 95.83
malaxxxx:Mala :MALA09557914 : 96.0: 69.50:100.0:100.0: 34.00: 47.0: 74.42
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455234.html
標籤:重击
