Bash
在awk中總結一個數組?
我有以下程式碼:
sum1= sum2= declare -a a echo $temp | awk '{split($0,a,","); name=a[1] ; for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }'
此程式碼不起作用。這裡 temp 是一個類型的字元串:
abc,1,2,3,4,5,6
實際上我正在從文件中解析數據。輸入文件如下:
abc,1,2,3,4,5,6 de,3,5,7,8,4,2 xyz,6,5,3,7,8,2
我正在閱讀它
while read temp do #do something done < sample.csv
預期輸出的形式為:
Name Sum1 Sum2 abc 6 15 de 15 14 xyz 14 17
設置 $temp
首先確保您已
$temp
正確設置變數:$ temp="abc,1,2,3,4,5,6" $ echo "$temp" abc,1,2,3,4,5,6
簡單的例子
我使用以下方法來做到這一點:
$ echo "$temp" | tr ',' '\n' | grep -v abc | awk '{sum+=$1};END{print sum}' 21
你的例子
END{...}
關於您的方法,您忘記列印使用塊累積的數組:$ echo "$temp" | awk '{split($0,a,","); name=a[1] for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] } END{print sum1; print sum2}' 6 15
保存以備後用
awk 沒有一種方法可以將結果從呼叫它的地方注入到父 shell 中,所以你必須有點狡猾並將它的結果保存到 Bash 中的數組中。
例子
$ myarr=($(echo "$temp" | awk '{split($0,a,","); name=a[1] for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] } END{ print sum1; print sum2}'))
上面是這樣做的:
$ myarr=($(...awk command...))
這將導致您的值來自
sum1
並sum2
保存到數組$myarr
中。訪問數組 $myarr
它們可以像這樣訪問:
$ echo "${myarr[@]}" 6 15 $ echo "${myarr[0]}" 6 $ echo "${myarr[1]}" 15
試試這個:
$ awk -F',' 'BEGIN{OFS="\t";print "Name","Sum1","Sum2"} {print $1,$2+$3+$4,$5+$6+$7}' sample.csv Name Sum1 Sum2 abc 6 15 de 15 14 xyz 14 17
不需要你的 bash 循環,你可以在
awk
. 該-F
選項允許您定義輸入欄位分隔符,在本例,
中為 ,因此您無需顯式拆分行。由於awk
逐行讀取文件,因此您也不需要讀取bash
.該
BEGIN{}
塊在讀取第一行之前執行,僅列印標題並將輸出分隔符(OFS
) 設置為選項卡。由於欄位已經分開,您需要做的就是總結欄位 2-4 和 5-7 並為每一行列印它們。