我将单行 sql 结果保存到文件中。
AA 10 BB 20 DD 14 GG 14
我想计算每个单词旁边的数字并将其保存为变量。
如果没有(如 CC),则应计为 0。
aCnt=10
bCnt=20
cCnt=0
'grep' 或 'awk' 可以做到这一点吗?
答案1
我认为你最好使用关联数组而不是一堆单独的变量:
line="AA 10 BB 20 DD 14 GG 14"
read -ra words <<< "$line"
declare -A cnt
for ((i = 0; i < ${#words[@]}; i += 2)); do
label=${words[i]}
num=${words[i+1]}
cnt[${label:0:1}]=$num
done
declare -p cnt # => declare -A cnt=([G]="14" [D]="14" [B]="20" [A]="10" )
现在:
letter=A
echo "$letter count is ${cnt[$letter]:-0}" # => A count is 10
letter=C
echo "$letter count is ${cnt[$letter]:-0}" # => C count is 0
对于单个变量,我们可以使用declare
“动态”变量名称:
for a in {a..z}; do
declare "${a}Cnt=0"
done
line="AA 10 BB 20 DD 14 GG 14"
declare -l letter # lowercase
while [[ $line =~ ([A-Z]+)" "([0-9]+)(.*) ]]; do
letter=${BASH_REMATCH[1]:0:1}
declare "${letter}Cnt=${BASH_REMATCH[2]}"
line=${BASH_REMATCH[3]}
done
现在我们有:
$ set | grep '.Cnt'
aCnt=10
bCnt=20
cCnt=0
dCnt=14
eCnt=0
fCnt=0
gCnt=14
hCnt=0
iCnt=0
jCnt=0
kCnt=0
lCnt=0
mCnt=0
nCnt=0
oCnt=0
pCnt=0
qCnt=0
rCnt=0
sCnt=0
tCnt=0
uCnt=0
vCnt=0
wCnt=0
xCnt=0
yCnt=0
zCnt=0
答案2
同样疯狂awk
......因为那是标签
awk -vRS=" " '{a=tolower(substr($0,1,1)); getline; aa[a]=$0}
END{for (a=97; a<=122; a++) {A=sprintf("%c",a); print A"Cnt="aa[A]+0}}' file
使用字符串字符打破 、关联数组和一些 jiggery pokeryRS
上的记录
aCnt=10
bCnt=20
cCnt=0
dCnt=14
eCnt=0
fCnt=0
gCnt=14
hCnt=0