web-dev-qa-db-fra.com

Comment diviser un fichier en mots en ligne de commande unix?

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!

20
jaundavid

En utilisant tr:

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

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

6
geekQ

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).

3
FatalError

grep -o imprime uniquement les parties de la ligne correspondante correspondant au motif

grep -o '[[:alpha:]]*' file
2
umi
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)

1
kyticka

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.

1
Ed Morton

cette ligne awk peut fonctionner aussi?

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

Utiliser Perl :

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

Sortie

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", 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"; } ' 

0
Fred Gannett

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

0
jpmuc

Utiliser Perl:

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

0
jsageryd