it-swarm.com.de

Wie kann eine Datei in einer Unix-Befehlszeile in Wörter aufgeteilt werden?

Ich mache schnellere Tests für ein naives boolesches Information Retrival System, und ich möchte awk, grep, egrep, sed oder ähnliches und pipes verwenden, um eine Textdatei in Wörter aufzuteilen und sie mit einem Word pro Zeile in eine andere Datei zu speichern . Beispiel für meine Dateiketten:

Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.

Die Ausgabedatei sollte enthalten:

Hola
mundo
hablo
español
...

Danken!

20
jaundavid

Mit tr:

tr -s '[[:punct:][:space:]]' '\n' < file
43
Guru

Das einfachste Werkzeug ist fmt:

fmt -1 <your-file

fmt soll Zeilen auf die angegebene Breite brechen, und wenn Sie -1 angeben, bricht es unmittelbar nach dem Word ab. Siehe man fmt zur Dokumentation. Inspiriert von http://everythingsysadmin.com/2012/09/unorthodoxunix.html

6
geekQ

sed verwenden:

$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile

im Grunde werden dadurch alle Satzzeichen gelöscht und Leerzeichen durch Zeilenumbrüche ersetzt. Dies setzt auch voraus, dass Ihr Geschmack von sed\n versteht. Einige tun dies nicht - in diesem Fall können Sie stattdessen einfach einen wörtlichen Zeilenumbruch verwenden (d. H. Durch Einbetten in Ihre Anführungszeichen).

3
FatalError

grep -o druckt nur die Teile der passenden Linie, die dem Muster entsprechen

grep -o '[[:alpha:]]*' file
2
umi
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v

tr -d ",." löscht "," und "."

tr "\ t" "\ n" ändert Leerzeichen und Tabulatoren in Zeilenumbrüche

grep -e "^ $" -v löscht leere Zeilen (bei zwei oder mehr Leerzeichen)

1
kyticka

Basierend auf Ihren bisherigen Antworten denke ich, was Sie wahrscheinlich suchen, ist, Wörter als Zeichenfolgen zu behandeln, die durch Leerzeichen, Kommas, Satzende-Zeichen (dh ".", "!" Oder "?" In Englisch) und andere getrennt sind Zeichen, die Sie normalerweise NICHT in Kombination mit alphanumerischen Zeichen finden würden (z. B. "<" und ";", aber nicht '-#$%). Jetzt, "." ist ein Satzendzeichen, aber Sie sagten, dass $27.00 als "Wort" betrachtet werden sollte. . muss je nach Kontext unterschiedlich behandelt werden. Ich denke, dasselbe gilt wahrscheinlich für "-" und möglicherweise für andere Charaktere.

Sie brauchen also eine Lösung, die dies umsetzt:

I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".

das sehr gut finden:

I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at 
[email protected]

Ist das korrekt?

Versuchen Sie dies mit GNU awk, damit wir RS auf mehr als ein Zeichen setzen können:

$ cat file
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".

$ gawk -v RS="[[:space:]?!]+" '{gsub(/^[^[:alnum:]$#]+|[^[:alnum:]%]+$/,"")} $0!=""' file
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]

Versuchen Sie, mit anderen Testfällen auszukommen, um zu sehen, ob dies immer das tut, was Sie wollen.

1
Ed Morton

kann diese awk-linie auch funktionieren?

awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1'  inputfile
1
Imagination

Verwenden von Perl :

Perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file

Ausgabe

Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
0
Gilles Quenot

Perl -ne 'print join ("\ n", aufgeteilt) 

Entschuldigung @jsageryd 

Dieser eine Liner gibt keine korrekte Antwort, da er das letzte Wort online mit dem ersten Wort am nächsten verbindet. 

Dies ist besser, erzeugt jedoch für jede leere Zeile in src eine Leerzeile. Rohrleitung über | sed '/ ^ $/d' um das zu beheben

Perl -ne '{print join ("\ n", geteilt (/ [[: ^ Word:]] + /)), "\ n"; } ' 

0
Fred Gannett

Eine sehr einfache Option wäre zunächst,

sed 's,\(\w*\),\1\n,g' file

vorsicht, es behandelt weder Apostrophe noch Satzzeichen

0
jpmuc

Perl verwenden:

Perl -ne 'print join("\n", split)' < file

0
jsageryd