Question

Je fais un script shell pour trouver des bigrammes, ce qui fonctionne, en quelque sorte.

#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

Le seul problème est qu’il associe les mots de la fin et du début de la phrase précédente.

Par exemple, pour les deux phrases "bonjour le monde". et 'foo bar.' Je vais avoir une ligne avec 'world. foo '. Serait-il possible de les filtrer avec grep ou quelque chose?

Je sais que je peux trouver tous les bigrammes contenant un arrêt complet avec grep [.], mais qui trouve également les bigrams légitimes.

Était-ce utile?

La solution

Il suffit de remplacer la ligne de collage par ceci:

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

Ceci filtrera toutes les lignes contenant un point autre que le dernier caractère d'une ligne.

Autres conseils

Les scripts de shell peuvent utiliser des canaux.

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
}

Le code utilise cat comme collecteur universel de données - tr est un filtre pur qui n'accepte aucun argument de nom de fichier. L'idée de base est que la variable old contient le premier mot et que new lit le nouveau mot. Quand ancien se termine par un point (comme au début), il ne forme pas une bigram valide selon vos règles. Si vous souhaitez supprimer les points des bigrammes de fin de phrase, vous pouvez utiliser:

 echo "$old ${new%.}"

La version sans fioritures (avec des points en écho) fonctionne avec Bourne Shell ainsi que des dérivés; la version avec le $ {new%.} ne contient que les travailleurs avec le shell Korn et ses dérivés - pas le shell Bourne original.

Si vous devez utiliser des fichiers temporaires, assurez-vous que leurs noms contiennent l'ID de processus ($$) et utilisez l'interruption pour les supprimer:

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

Le signal 1 est un raccrochage (HUP), 2 est une interruption (INT), 3 est quitté (QUIT), 13 est un tuyau (PIPE) et 15 est terminé (TERM). 0 est «toute sortie» et est presque juju dans ce contexte. Avant de quitter, pensez à annuler le piège de sortie, comme indiqué.

Vous pouvez également consulter de Unix pour les poètes de Ken Church. (PDF) - un classique décrivant les solutions à des problèmes similaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top