파일에서 가장 일반적인 문자/문자 조합 찾기
단순히 반복되는 단어를 찾는 대신(a la:파일에서 n개의 가장 일반적인 단어 찾기), 반복되는 문자 조합 문자열을 모두 나열해야 합니다...
파일에서 가장 자주 발생하는 모든 길이의 문자/문자 조합을 기록하고 싶으십니까?
예시 목록:
Stack
Exchange
Internet
Web
Question
Find
Frequent
Words
Combination
Letters
....
결과적으로 반복되는 문자 조합:
[a,b,c,d,e,f,g,i,k,l,m,n,o,q,r,s,t,u,w,x]
in
ue
st
tion
ion
on
ti
et
te
ter
...
발생 횟수에 따라 결과를 나열할 수 있음 = 보너스 :)
답변1
반복되는 모노그램 문자열을 모두 나열해야 합니다...
...그래서 스크립트에서 1글자부터 전체 줄 길이(샘플 데이터가 줄당 1단어를 제공하므로 단어의 길이)까지 가능한 모든 길이를 살펴보게 했습니다...
문서 ssf.mawk
:
#!/usr/bin/mawk -f
BEGIN {
FS=""
}
{
_=tolower($0)
for(i=1;i<=NF;i++)
for(j=i;j<=NF;j++)
print substr(_,i,j-i+1) | "sort|uniq -c|sort -n"
}
샘플 입력을 사용하여 실행 출력을 줄입니다.
$ printf '%s\n' Stack Exchange Internet Web Question Find Frequent Words Combination Letters .... | ./ssf.mawk
1 ....
1 ac
1 ack
1 an
1 ang
(((여기서 많은 줄이 생략되었습니다)))
4 s
5 i
8 n
8 t
10 e
mawk-1.3.3
나는 이것을 Debian8에서 테스트했습니다 gawk-4.1.1
.
답변2
최소한 두 개(가장 작은 N
변경 사항에 대해)가 있다고 가정하고 대소문자를 무시하고 한 줄에 어떤 조합이든 다음과 같이 수행할 수 있습니다.{2,$l}
{N,$l}
% < examplelist
Stack
Exchange
Internet
Web
Question
Find
Frequent
Words
Combination
Letters
% < examplelist perl -nlE '$_=lc; $l=length; next if $l < 2; m/(.{2,$l})(?{ $freq{$1}++ })^/; END { say "$freq{$_} $_" for keys %freq }' | sort -rg | head -4
3 in
2 ue
2 tion
2 tio
답변3
이것은 발생순으로 출력을 정렬하는 Perl 스크립트입니다. 최소 문자열 길이는 구성 가능하며, 진행 상황을 확인할 수 있는 디버깅 옵션이 포함되어 있습니다.
#!/usr/bin/perl
# Usage: perl script_file input_file
use strict;
my $min_str_len = 2;
my $debug = 0;
my %uniq_substrings;
while(<>)
{
chomp;
my $s = lc $_; # assign to $s for clearity
printf STDERR qq|#- String: [%s]\n|, $s if $debug;
my $line_len = length($s);
for my $len ($min_str_len .. $line_len)
{
printf STDERR qq|# Length: %u\n|, $len if $debug;
# break string into characters
my @c = split(//,$s);
# iterate over list while large enough to provide strings of $len characters
while(@c>=$len)
{
my $substring = join('', @c[0..$len-1]);
my $curr_count = ++$uniq_substrings{$substring};
printf STDERR qq|%s (%s)\n|, $substring, $curr_count if $debug;
shift @c;
}
}
}
sub mysort
{
# sort by count, subsort by alphabetic
my $retval =
($uniq_substrings{$b} <=> $uniq_substrings{$a})
|| ($a cmp $b);
return $retval;
}
for my $str (sort(mysort keys %uniq_substrings))
{
printf qq|%s = %u\n|, $str, $uniq_substrings{$str};
}
답변4
스크립트:
MIN=2
MAX=5
while read A; do
[ ${MAX} -lt ${#A} ] && max=${MAX} || max=${#A}
for LEN in $(seq ${MIN} ${max}); do
for k in $(seq 0 $((${#A}-${LEN}))); do
echo "${A:$k:${LEN}}"
done
done
done <<< "$(cat file1|tr 'A-Z' 'a-z')" |sort|uniq -c|sort -k1,7rn -k9
몇 가지 설명이 있습니다.
# define minimal length of letters combinations
MIN=2
# define maximal length of letters combinations
MAX=5
# take line by line
while read A; do
# determine max length of letters combination for this line
# because it is shorter than MAX above if length of the line is shorter
[ ${MAX} -lt ${#A} ] && max=${MAX} || max=${#A}
# in cycle take one by one possible lengths of letters combination for line
for LEN in $(seq ${MIN} ${max}); do
# in cycle take all possible letters combination for length LEN for line
for k in $(seq 0 $((${#A}-${LEN}))); do
# print a letter combination
echo "${A:$k:${LEN}}"
done
done
done <<< "$(cat file1|tr 'A-Z' 'a-z')" |sort|uniq -c|sort -k1,7rn -k9
# the data are taken from file "file1" and converted to lowercase,
# the data are sorted, unique lines counted,
# after results sorted according to string numerical values for numbers
# and strings with the same numbers sorted in alphabetical order
매개변수 MIN=2 및 MAX=5인 경우 처음 30줄이 출력됩니다(총 출력은 152줄입니다).
3 in
2 er
2 et
2 io
2 ion
2 nt
2 on
2 qu
2 que
2 st
2 te
2 ter
2 ti
2 tio
2 tion
2 ue
1 ac
1 ack
1 an
1 ang
1 ange
1 at
1 ati
1 atio
1 ation
1 bi
1 bin
1 bina
1 binat
1 ch
...
매개변수 MIN=1 및 MAX=3인 경우 처음 20줄이 출력됩니다(총 출력은 109줄입니다).
10 e
8 n
8 t
5 i
4 o
4 r
4 s
3 a
3 c
3 in
2 b
2 d
2 er
2 et
2 f
2 io
2 ion
2 nt
2 on
2 q
...