Frage

Ich mache einen Shell-Skript Bigrams zu finden, das funktioniert, irgendwie.

#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

Das einzige Problem ist, dass es Paare Worte vom Ende und Anfang des vorherigen Satzes.

zB für die beiden Sätze ‚Hallo Welt.‘ und 'foo bar.' Ich werde eine Zeile mit "Welt bekommen. foo‘. Wäre es möglich, diese mit grep oder etwas herauszufiltern?

Ich weiß, dass ich alle Bigrams findet einen Punkt mit grep, die [.], Aber das findet auch den legitimen Bigrams.

War es hilfreich?

Lösung

Ersetzen Sie einfach die Paste Linie mit diesem:

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

Dadurch werden alle Zeilen herauszufiltern, die einen Punkt enthalten, die nicht das letzte Zeichen einer Zeile ist.

Andere Tipps

Shell-Skripte können Rohre verwendet werden.

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
}

Der Code verwendet cat als universelle Datensammler - tr ist ein reiner Filter, der keine Dateinamen Argumente akzeptiert. Die Grundidee ist, dass die Variable alt das erste Wort enthält, und neue liest das neue Wort. Wenn alte mit einem Punkt endet (wie es am Anfang des Fall ist), ist es nicht eine gültige Bigramm unter den Regeln bilden. Wenn Sie die Punkte aus dem Satzende Bigrams entfernen möchten, können Sie:

 echo "$old ${new%.}"

Die ungeschminkte Version (mit Punkten Echo) arbeitet mit dem Bourne-Shell sowie Derivate; die Version mit dem ${new%.} nur Arbeitern mit Korn-Shell und Derivate -. nicht dem ursprünglich Bourne-Shell

Wenn Sie temporäre Dateien verwenden müssen, dann ihre Namen die Prozess-ID enthalten machen ($$) und verwenden Falle, sie zu entfernen:

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

Signal 1 ist Hangup (HUP), 2-Interrupt (INT), 3 wird beendet (ENDE), 13 ist Rohr (Rohr) und 15 ist beendet (TERM); 0 "jede Ausfahrt und ist fast Juju in diesem Zusammenhang. Vor dem eigentlichen Verlassen erinnert die Ausfahrt Falle abzubrechen, wie dargestellt.

Sie können auch Ken Kirche „Unix für Dichter“ durchsuchen möchten ( PDF) -. eine klassische Beschreibung von Lösungen für ähnliche Probleme

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top