3

バイグラムを見つけるためのシェルスクリプトを作成していますが、これはある程度機能します。

#tokenise words
tr -sc 'a-zA-z0-9.' '\012' < $1 > out1
#create 2nd list offset by 1 word
tail -n+2 out1 > out2
#paste list together
paste out1 out2 
#clean up
rm out1 out2

唯一の問題は、前の文の末尾と先頭の単語がペアになっていることです。

たとえば、'hello world.' という 2 つの文の場合です。と「フーバー」。私は「世界」と一線を画します。ふー」。これらをgrepなどで除外することは可能でしょうか?

grep [.] で終止符を含むすべてのバイグラムを見つけることができることはわかっていますが、それは正当なバイグラムも見つけます。

4

2 に答える 2

2

貼り付け行を次のように置き換えるだけです。

paste out1 out2 | grep -v '\..'

これにより、行の最後の文字ではないピリオドを含む行が除外されます。

于 2008-10-28T22:29:55.590 に答える
2

シェル スクリプトはパイプを使用できます。

cat "$@" |
tr -cs "a-zA-Z0-9." '\012' |
{
old="aaa."
while read new
do
    case "$old" in
    *.) : OK;;
    *)  echo "$old $new";;
    esac
    old="$new"
done
}

このコードはcat、データのユニバーサル コレクターとして使用しtrます。これは、ファイル名の引数を一切受け入れない純粋なフィルターです。基本的な考え方は、変数 old には最初の単語が含まれ、new は新しい単語を読み取るというものです。old がピリオドで終わる場合 (最初の場合のように)、ルールの下では有効なバイグラムを形成しません。文末のバイグラムからドットを削除する場合は、次を使用できます。

 echo "$old ${new%.}"

飾られていないバージョン (ドットがエコーされている) は、Bourne シェルと派生シェルで動作します。${new%.}オリジナルの Bourne シェルではなく、Korn シェルとその派生物を使用する唯一のワーカーを含むバージョン。

一時ファイルを使用する必要がある場合は、それらの名前にプロセス ID ($$) が含まれるようにし、trap を使用してそれらを削除します。

tmp=${TMPDIR:-/tmp}/bigram.$$
trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15

...code using $tmp.1, $tmp.2, etc...

rm -f $tmp.?
trap 0

シグナル 1 はハングアップ (HUP)、2 は割り込み (INT)、3 は終了 (QUIT)、13 はパイプ (PIPE)、15 は終了 (TERM) です。0 は「任意の出口」であり、このコンテキストではほぼ juju です。実際に終了する前に、示されているように終了トラップをキャンセルすることを忘れないでください。

于 2008-10-28T22:57:26.753 に答える