我想计算列表中无序对的数量。
换句话说,我有一个清单:
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