如何从列表中查找无序对的数量

如何从列表中查找无序对的数量

我想计算列表中无序对的数量。

换句话说,我有一个清单:

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

每个字段匹配一个字符 ( -F '')。如果根据当前区域设置第一个大于第二个,我们只是反转字符(这并不重要)。然后我们对结果进行排序并用 来计算相同的连续行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

或者作为一个单独的脚本:

命令.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

相关内容