リスト内で順序付けされていないペアの数を見つける方法

リスト内で順序付けされていないペアの数を見つける方法

リスト内で順序付けされていないペアの数を計算したいと思います。

つまり、リストがあります。

ab
ba
ac
bc

表示したい内容:

2 ab
1 ac
1 bc

答え1

これは良いことのようですperl

perl -F -lane '$count{join "", sort @F}++;
               END{print "$count{$_} $_" for sort keys %count}' < your-file

答え2

そしてgawk

gawk -F '' '{ print ($1 > $2) ? $2$1 : $1$2 }' | sort | uniq -c

各フィールドは1文字(-F '')と一致します。現在のロケールに応じて、最初の文字が2番目より大きい場合は、文字を逆に変更できます(関係ありません)。次に結果をソートし、それを使用して同じ連続行数を計算しますuniq -c

答え3

最新バージョンのGNU awkの一般的なアプローチは次のとおりです。

gawk -i join '
{
  split($0, F, //)
  asort(F)
  h[join(F, 1, length(F), SUBSEP)]++
}
END {
  asorti(h, x)
  for(k in h) 
    print h[k], k
}' infile

または別のスクリプトとして:

command.awk

@include "join"
{
  split($0, F, //)
  asort(F)
  h[join(F, 1, length(F), SUBSEP)]++
}
END {
  asorti(h, x)
  for(k in h) 
    print h[k], k
}

次のように実行します。

gawk -f order.awk infile

出力:

2 ab
1 ac
1 bc

答え4

fishシェル:

⋊> ~ echo 'ab
     ba
     ac
     bc' | while read line; echo -n "$line" | sed -r 's|(.)|\1\n|g' | sort | xargs | tr --delete ' '; end | uniq -c

bashシェル:

bash-3.2$ echo 'ab
ba
ac
bc' | while read line; do echo -n "$line" | sed -r 's|(.)|\1\n|g' | sort | xargs | tr --delete ' '; done | uniq -c

出力:

     2 ab
     1 ac
     1 bc

関連情報