
저는 Unix 쉘 스크립트를 사용하고 있으며 다음 데이터가 포함된 입력 파일이 있습니다.
3:abc
1:xyz
1:abc
2:def
10:xyz
내 예상 결과는 다음과 같습니다
4:abc
11:xyz
2:def
즉, 구분 기호 뒤의 각 줄에서 고유한 문자열을 찾아 그 앞에 숫자를 추가합니다. 어떻게 해야 하나요?
답변1
여기에 사용된 솔루션이 있습니다 awk
. 값을 배열에 누적합니다.
awk -F ":" '{count[$2]+=$1} END {for (key in count) print key, count[key]}' awk_data.txt
다음은 bash
스크립트를 사용하는 버전입니다.
#!/usr/bin/env bash
declare -A count
while read line; do
key=${line##*:}
cnt=${line%%:*}
count[$key]=$(($cnt + ${count[$key]=0}))
done < "$1"
for K in "${!count[@]}"; do echo $K ${count[$K]}; done
bash
댓글의 다른 버전은 다음을 사용합니다.IFS=:
#!/usr/bin/env bash
declare -A count
while IFS=: read -r cnt key; do
count[$key]=$(($cnt + ${count[$key]=0}))
done < "$1"
for K in "${!count[@]}"; do echo $K ${count[$K]}; done
답변2
GNU에서 전리품을 얻고 싶을 수도 있습니다.데이터 혼합유용. 예(PO의 table.txt):
$ sort -t: -k 2 table.txt | datamash -t: -g 2 sum 1 collapse 1
abc:4:1,3
def:2:2
xyz:11:10,1
-t:
필드 구분 기호는 다음과 같습니다.-g 2
두 번째(이전에 정렬된) 열을 기준으로 그룹화sum 1
1열의 해당 값을 합산합니다.collapse 1
","를 사용하여 별도의 목록으로 축소합니다.