목록에서 순서가 지정되지 않은 쌍의 수를 계산하고 싶습니다.
즉, 목록이 있습니다.
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
또는 별도의 스크립트로:
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