シェルスクリプトを使用して、各行内の一意の文字列数を計算します。

シェルスクリプトを使用して、各行内の一意の文字列数を計算します。

私は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 22番目(以前にソートされた)列に基づいてグループ化
  • sum 1列1の対応する値を合計します。
  • collapse 1「、」を使用して別のリストに縮小します。

関連情報