Bash

在awk中總結一個數組?

  • April 14, 2019

我有以下程式碼:

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...))

這將導致您的值來自sum1sum2保存到數組$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 並為每一行列印它們。

引用自:https://unix.stackexchange.com/questions/90898