Je fais des tests plus rapides pour un système de récupération d’informations booléen naïf, et je voudrais utiliser awk, grep, egrep, sed ou chose similaire et des tuyaux pour scinder un fichier texte en mots et les enregistrer dans un autre fichier avec un mot par ligne . Exemple mon dossier contient:
Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.
Le fichier de sortie doit contenir:
Hola
mundo
hablo
español
...
Remercier!
En utilisant tr:
tr -s '[[:punct:][:space:]]' '\n' < file
L'outil le plus simple est fmt:
fmt -1 <your-file
fmt conçu pour casser les lignes pour s’adapter à la largeur spécifiée et si vous fournissez -1
, il se brise immédiatement après le mot. Voir man fmt
pour la documentation. Inspiré par http://everythingsysadmin.com/2012/09/unorthodoxunix.html
Utiliser sed
:
$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile
en gros, cela supprime toute ponctuation et remplace tout espace par des nouvelles lignes. Cela suppose également que votre version de sed
comprend \n
. Certains ne le font pas - dans ce cas, vous pouvez simplement utiliser une nouvelle ligne littérale (c'est-à-dire en l'intégrant dans vos guillemets).
grep -o
imprime uniquement les parties de la ligne correspondante correspondant au motif
grep -o '[[:alpha:]]*' file
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v
tr -d ",." supprime "," et "."
tr "\ t" "\ n" modifie les espaces et les tabulations en nouvelles lignes
grep -e "^ $" -v supprime les lignes vides (dans le cas de deux espaces ou plus)
D'après vos réponses jusqu'à présent, je pense que ce que vous recherchez probablement est de traiter les mots comme des séquences de caractères séparées par des espaces, des virgules, des caractères de fin de phrase (par exemple "." les caractères que vous ne rencontriez normalement pas en combinaison avec des caractères alphanumériques (par exemple "<" et ";" mais pas '
-
#
$
%
). À présent, "." est un caractère de fin de phrase mais vous avez dit que $27.00
devrait être considéré comme un "mot", donc .
doit être traité différemment en fonction du contexte. Je pense que la même chose est probablement vraie pour "-" et peut-être d'autres caractères.
Donc vous avez besoin d’une solution qui convertira ceci:
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".
dans ceci:
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]
Est-ce exact?
Essayez ceci en utilisant GNU awk afin que nous puissions définir RS sur plus d'un caractère:
$ 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]
Essayez de trouver d'autres cas de test pour voir si cela fait toujours ce que vous voulez.
cette ligne awk peut fonctionner aussi?
awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1' inputfile
Utiliser Perl :
Perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file
Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
Perl -ne 'print join ("\ n", split)'
Désolé @jsageryd
Cette réponse ne donne pas la réponse correcte car elle joint le dernier mot en ligne au premier mot suivant.
C'est mieux, mais génère une ligne vide pour chaque ligne vide dans src. Pipe via | sed '/ ^ $/d' pour résoudre ce problème
Perl -ne '{print join ("\ n", divisé (/ [[: ^ Word:]] + /)), "\ n"; } '
Une option très simple serait d'abord,
sed 's,\(\w*\),\1\n,g' file
méfiez-vous, il ne gère ni les apostrophes ni la ponctuation
Utiliser Perl
:
Perl -ne 'print join("\n", split)' < file