![쉘 스크립트를 사용하여 각 줄에 있는 고유 문자열 수를 계산합니다.](https://linux55.com/image/105258/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B0%81%20%EC%A4%84%EC%97%90%20%EC%9E%88%EB%8A%94%20%EA%B3%A0%EC%9C%A0%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%88%98%EB%A5%BC%20%EA%B3%84%EC%82%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
저는 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
","를 사용하여 별도의 목록으로 축소합니다.