목록에서 순서가 지정되지 않은 쌍의 수를 찾는 방법

목록에서 순서가 지정되지 않은 쌍의 수를 찾는 방법

목록에서 순서가 지정되지 않은 쌍의 수를 계산하고 싶습니다.

즉, 목록이 있습니다.

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

관련 정보