Pergunta

Eu estou fazendo um script shell para encontrar bigramas, que funciona, de certa forma.

#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

O único problema é que ele pares palavras a partir do final e início da frase anterior.

por exemplo, para as duas frases 'Olá mundo'. e 'foo bar. i vai ter uma linha com 'mundo. foo'. Seria possível para filtrar estes para fora com grep ou algo assim?

Eu sei que posso encontrar todas as bigramas contendo um ponto final com grep [.], Mas que também encontra os bigramas legítimos.

Foi útil?

Solução

Apenas substituir a linha colar com esta:

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

Este irá filtrar todas as linhas que contêm um ponto que não é o último caractere de uma linha.

Outras dicas

Os shell scripts pode usar tubos.

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
}

Os usos de código cat como o coletor universal de dados - tr é um filtro puro que não aceita quaisquer argumentos de nome de arquivo. A idéia básica é que a variável idade contém a primeira palavra, e novo lê a palavra nova. Quando termina velhos com um ponto (como faz no início), não formam um bigram válida sob suas regras. Se você deseja remover os pontos dos bigramas fim de frase, você pode usar:

 echo "$old ${new%.}"

A versão sem adornos (com pontos de eco) trabalha com Bourne shell, bem como derivados; a versão com o ${new%.} apenas os trabalhadores com Korn e derivados -. não o original shell Bourne

Se você deve usar arquivos temporários, em seguida, fazer seus nomes contêm a identificação do processo ($$) e uso armadilha para removê-los:

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

de sinal 1 é desligamento (HUP), 2 é de interrupção (INT), 3 é quit (SAIR), 13 é o tubo (o tubo) e 15 é encerrar (TERMO); 0 é 'qualquer saída' e é quase juju neste contexto. Antes de realmente sair, lembre-se de cancelar a saída armadilha, como mostrado.

Você também pode querer browse Ken Igreja de "Unix para Poets" ( PDF) -. um clássico soluções que descrevem a problemas semelhantes

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top