여러 단어를 찾아 한 줄의 다음 숫자를 인쇄하세요.

여러 단어를 찾아 한 줄의 다음 숫자를 인쇄하세요.

한 줄의 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 pokery를 사용하여 RS녹음

aCnt=10
bCnt=20
cCnt=0
dCnt=14
eCnt=0
fCnt=0
gCnt=14
hCnt=0

관련 정보