unix - txt - linux sed insertar linea
¿Cómo dividir un archivo en palabras en la línea de comandos de Unix? (11)
Estoy haciendo pruebas más rápidas para un sistema ingenuo de recuperación de información booleana, y me gustaría usar awk, grep, egrep, sed o thing similar y pipe para dividir un archivo de texto en palabras y guardarlos en otro archivo con una palabra por línea . Ejemplo mi archivo contiene:
Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.
El archivo de salida debe contener:
Hola
mundo
hablo
español
...
¡Gracias!
perl -ne ''print join ("/ n", split)''
Lo siento @jsageryd
Esa línea no da la respuesta correcta, ya que une la última palabra en línea con la primera palabra en la siguiente.
Esto es mejor, pero genera una línea en blanco para cada línea en blanco en src. Tubería a través de | sed ''/ ^ $ / d'' para arreglar eso
perl -ne ''{print join ("/ n", split (/ [[: ^ word:]] + /)), "/ n"; } ''
Esta línea awk puede funcionar también?
awk ''BEGIN{FS="[[:punct:] ]*";OFS="/n"}{$1=$1}1'' inputfile
La herramienta más sencilla es fmt:
fmt -1 <your-file
fmt, diseñado para romper líneas para que se ajuste al ancho especificado y si proporciona -1
se rompe inmediatamente después de la palabra. Ver man fmt
para la documentación. Inspirado por http://everythingsysadmin.com/2012/09/unorthodoxunix.html
Según sus respuestas hasta el momento, PIENSO que lo que probablemente está buscando es tratar las palabras como secuencias de caracteres separados por espacios, comas, caracteres que terminan en las oraciones (es decir, "." "!" O "?" En inglés) y otros caracteres que NO encontrarías normalmente en combinación con caracteres alfanuméricos (por ejemplo, "<" y ";" pero no ''
-
#
$
%
). Ahora, "." es un carácter de terminación de oración, pero usted dijo que $27.00
debería considerarse una "palabra" .
Necesita ser tratado de manera diferente dependiendo del contexto. Creo que lo mismo es probablemente cierto para "-" y tal vez algunos otros personajes.
Así que necesitas una solución que convierta esto:
I have $27.00. We''re 20% under-budget, right? This is #2 - mail me at "[email protected]".
dentro de esto:
I
have
$27.00
We''re
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]
¿Es eso correcto?
Intente esto usando GNU awk para que podamos establecer RS en más de un carácter:
$ 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]
Trate de encontrar otros casos de prueba para ver si esto siempre hace lo que usted quiere.
Una opción muy simple sería primero,
sed ''s,/(/w*/),/1/n,g'' file
ten cuidado, no manejes ni apóstrofes ni puntuación
Utilizando perl
:
perl -ne ''print join("/n", split)'' < file
Utilizando sed
:
$ sed -e ''s/[[:punct:]]*//g;s/[[:space:]]/+//n/g'' < inputfile
Básicamente esto borra toda puntuación y reemplaza cualquier espacio con nuevas líneas. Esto también asume que su sabor de sed
comprende /n
. Algunos no lo hacen, en cuyo caso solo puede usar una nueva línea literal (es decir, incrustándolo dentro de sus citas).
Utilizando perl :
perl -pe ''s/(?:/p{Punct}|/s+)+//n/g'' file
Salida
Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
Utilizando tr:
tr -s ''[[:punct:][:space:]]'' ''/n'' < file
grep -o
imprime solo las partes de la línea coincidente que coinciden con el patrón
grep -o ''[[:alpha:]]*'' file
cat input.txt | tr -d ",." | tr " /t" "/n" | grep -e "^$" -v
tr -d ",." borra "," y "."
tr "/ t" "/ n" cambia los espacios y las pestañas a nuevas líneas
grep -e "^ $" -v elimina las líneas vacías (en el caso de dos o más espacios)