3

我正在制作一个 shell 脚本来查找二元组,这在某种程度上是可行的。

#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

唯一的问题是它将前一句的结尾和开头的单词配对。

例如对于两个句子“你好世界”。和“富吧”。我会与 'world. 富'。是否有可能用 grep 或其他东西过滤掉这些?

我知道我可以找到所有包含 grep [.] 句号的二元组,但这也能找到合法的二元组。

4

2 回答 2

2

只需将粘贴行替换为:

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

这将过滤掉任何包含句点的行,该句点不是一行的最后一个字符。

于 2008-10-28T22:29:55.590 回答
2

Shell 脚本可以使用管道。

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 shell 以及衍生物一起使用;具有 Korn shell 和衍生工具的唯一工作人员的版本${new%.}- 不是原始的 Bourne shell。

如果必须使用临时文件,则使它们的名称包含进程 ID ($$) 并使用陷阱删除它们:

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 回答