Linux
根據 Bash 中的輸入進行評分
你能幫我嗎?我有一個任務。我輸入了一些帶有數字的文本。例如:
beta 1 score 9 something 2 beta 4 something 1
我需要用相同的文本計算所有數字。我的輸出將是:(以這種方式使用“:”)
beta:5 something:3 score:9
臨時文件也可能有問題,我可以在其中保存我的分數。我需要
mktemp
在腳本完成後使用來刪除它。請幫幫我,謝謝。
我將假設輸入總是每行包含兩個欄位。
您可以使用 GNU
datamash
實用程序對數據進行排序,按第一個欄位對其進行分組,然後計算每個組的第二個欄位的總和:datamash -s -W --output-delimiter=: groupby 1 sum 2 <file
在這裡,
-s
對輸入進行排序,-W
使實用程序將任何連續的空白字元視為欄位分隔符,並將--output-delimiter=:
輸出分隔符設置為:
字元。其餘的告訴datamash
按第一個欄位分組併計算每個組的第二個欄位的總和。給定名為 的文件中問題中的輸入
file
,這將產生以下輸出:beta:5 score:9 something:3
您也可以通過任何其他方式解決此問題。最簡單的計算解決方案是使用
awk
:awk '{ sum[$1] += $2 } END { for (key in sum) printf "%s:%d\n", key, sum[key] }' file
在這裡,我們使用關聯數組 ,
sum
來保存第一個欄位中每個字元串的總和。該END
模組在輸入結束時執行,並將計算的總和與字元串一起輸出。請注意,此解決方案還假設第一個欄位是一個不包含空格字元的單詞,如問題所示。
使用 shell 循環,從原始文件中讀取已排序的行,每當遇到新的第一個欄位時列印並重置第二個欄位的總和:
unset -v prev sort file | { while read -r key value; do if [ "$key" != "${prev-$key}" ]; then # prev is set and different from $key printf '%s:%d\n' "$prev" "$sum" sum=0 fi prev=$key sum=$(( sum + value )) done if [ "${prev+set}" = set ]; then printf '%s:%d\n' "$prev" "$sum" fi }