2013-07-24 2 views
1

사려 깊고 지혜로운 사람이 bash 스크립트로 나를 도와 주었지만 최근에 내가 원하는 것을 분명히 설명하지 못했다는 사실을 깨달았습니다. 일반 텍스트 파일에 긴 구문 목록 (ngram)이 있습니다. 하나의 구문이 다른 구문의 일부인 경우, 더 긴 구문 만 사용되므로 더 짧은 구문을 삭제해야합니다. 아래의 코드는 더 긴 것을 삭제합니다. 전환을 원한다면 몇자를 바꿔야 할 것입니다.ngrams (기존 bash 스크립트로 조정)

#! /bin/bash 
((n=${1:-0})) || exit 1 

declare -A ngrams 

while read -ra line; do 
    for ((i = 0; i < ${#line[@]}; i++)); do 
      ((ngrams[${line[@]:i:n}]++)) 
    done 
done 

for i in "${!ngrams[@]}"; do 
    printf '%d\t%s\n' "${ngrams[$i]}" "$i" 
done 
+1

어쩌면 그는 '사려 깊은'것이 아니었을 수도 있습니다. (분명히 설명해 주었기 때문에 ** 당신이 ** 이해할 수 있도록 **). – devnull

+1

@ user1889034 - 입력 데이터의 예를 제공 할 수 있습니까? 원하지 않는 파편 중 더 긴 파편의 중간에 원하지 않는 파편이 나타날 수 있습니까? –

답변

1
적지 않은 문자를 변경하여

하지만 새로 작성 :

#! /bin/bash 

declare -a ngrams 
mapfile -t ngrams < $1 
for ((i=0; i<${#ngrams[@]}; i++)); do 
    for ((j=0; j<${#ngrams[@]}; j++)); do 
     if (( i!=j)) && [[ "${ngrams[j]}" == *"${ngrams[i]}"* ]]; then 
      continue 2 
     fi 
    done 
    echo ${ngrams[i]} >> $2 
done 

당신은 ngram.sh <infile> <outfile>하여 호출 할 수 있습니다. 예 :

> cat txt.in 
foo 
me me me 
kaaz 
bar 
foo bar 
blub 
me 
> ./ngram.sh txt.in txt.out 
> cat txt.out 
me me me 
kaaz 
foo bar 
blub 
+0

아름답게 작동합니다. 정말 고마워! – user1889034

관련 문제