一个有思想和聪明的人用一个bash脚本帮助了我一段时间,但我最近意识到我没有清楚地解释我想要的东西。我在纯文本文件中有很长的短语列表(ngrams)。如果一个短语是另一个短语的片段,则只有较长的短语有任何用途,因此需要删除较短的短语。下面的代码删除了较长的代码。我希望转换是一个改变几个字符的问题。
#! /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
答案 0 :(得分: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>
来呼叫它。 E.g:
> 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