¿Cómo combino todas las líneas en un archivo de texto en una sola línea?


28

Quiero obtener todas las líneas de un texto en una sola línea. Soy un principiante en la codificación tratando de aprender haciendo. He pasado cuatro horas tratando de resolver este problema. Sé que hay una solución simple para este problema. Esto es lo que he estado intentando.

sed -e 'N; s / \ n //' myfile.txt #No hace nada

sed -e: a -e N -e 's / \ n / /' -e ta myfile.txt #outout todo en mal estado y no puedo hacer la cabeza ni la cola de la sintaxis

gato myfile.txt | tr -d '\ n'> myfile.txt # Elimina todas las líneas

Aquí está el archivo de texto:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
GRIFFITH LABORATORIES
CONSEJO DEL CONDADO DE DUBLÍN DEL SUR
OFICINA
OFICINA (INDUSTRIAL)
Lista valorable
2 Polígono industrial de Pineview
Firhouse Road
Knocklyon
31 dic 2007
01 ene 2008 "   

No puedo entender dónde me he equivocado ...

Respuestas:


31

trcomo lo usó, debería funcionar y es el más simple: solo necesita enviarlo a otro archivo . Si usa el archivo de entrada como salida, el resultado es un archivo vacío como observó;

gato myfile.txt | tr -d '\ n'> oneline.txt

Debe recordar que algunos editores terminan una línea con \r\n. Para ese caso, use

cat myfile | tr -d '\r\n'

Gracias por su ayuda, pero aún no funciona. Sé que es algo básico y simple. El comando que le dio borró todas las líneas. Voy a publicar el archivo 500212 262578-4-4 23200 Griffith Laboratories LTD Griffith Laboratories sur de Dublín DIPUTACIÓN DE OFICINA OFICINA (Industrial) Lista catastral 2 Pineview Industrial Estate Firhouse carretera Knocklyon 31 de Dic de 2007 01 Ene 2008
John

@JOhn: ¿Cuál es el resultado o error?
ish

Iba a publicar editando mi respuesta. Después de usar el comando, el archivo estaba en blanco. Se veía así en el terminal "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Gracias de nuevo.
John

@ John: ¡ No puedes usar el mismo nombre de archivo de salida! (Ver respuesta). Por favor, intentecat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
Una mejor manera de hacerlo sería tr -d '\n' <input.txt > output.txt: evitar el uso inútil del gato y usar una tubería menos innecesaria.
evilsoup

8

Aquí está. Es otra solución y simple, fácil.

echo $(cat Input.txt) > Output.txt

2
No puedo creer que esto funcionó, increíble
mchid

echo `cat Input.txt` > Output.txt también funciona, solo otra variante
raider33

Si hay más de UN espacio en blanco (espacio, tabulación, nueva línea, etc.) en una sola división, serán reemplazados por un espacio.
iBug

Esta es una buena solución, pero en mi computadora, descubrí que toma alrededor de tres veces más tiempo que la trsolución.
LS

4

MÉTODO SIMPLE

Otro método usando awk,

cat myfile.txt | awk '{print}' ORS=''

Salida:

500212262578-4-423200 GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Lista Tasable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 dic 200701 ene 2008 "

Nota:

ORS = '' -> Este es su separador de campo, puede tener cualquier carácter entre comillas simples como separador de campo. Usando este método awk podemos incluir espacios y todos los caracteres.

Espero que esto pueda ayudar!


1
ORS es el separador de registro de salida. OFS es el separador de campo de salida. Ver thegeekstuff.com/2010/01/… oman awk
Elder Geek

3

No es necesario poner la etiqueta :afuera de la instrucción principal, tampoco se -enecesita la opción necesaria; finalmente, el /$/es superfluo (cada línea tiene un carácter EOL).

Mejorando otras respuestas, uno obtiene

sed -i ':a; N; s/\n/ /; ta' file

Lo cual es más claro si se escribe de la siguiente manera,

sed -i ':a
        N
        s/\n/ /
        ta' file

El comando funciona de la siguiente manera:

  1. N agrega la siguiente línea al espacio de patrón (multilínea), que ya contiene la línea actual;
  2. s/\n/ /sustituya el carácter de nueva línea \ngenerado por Ncon un espacio ;
  3. tava a la línea del script que sigue a la etiqueta :a , siempre y cuando la sustitución en el paso 2 haya sido exitosa , es decir , si la sustitución se produjo, la ejecución salta al paso 1 sin "presionar" el final del script, es decir , sin leer otra línea de entrada.

Tenga en cuenta lo siguiente;

  • sedlee las líneas del archivo de entrada una por una en orden, comenzando desde la primera línea ;
  • :a es solo una etiqueta, no un comando a ejecutar;
  • N es, en principio, ejecutado en cualquier línea, pero
  • s/\n/ /(en principio ejecutado en cualquier línea) tiene éxito en cualquier línea que no sea la última , entonces
  • tahace que el final del script sea accesible solo cuando se lee la última línea de entrada (la única línea donde sfalla), por lo que
  • no se lee más línea de entrada en el espacio del patrón después de que se lee la primera , a menos que se lea la última , pero no hay más línea para leer y pse ejecuta el comando implícito .

Entonces, el script básicamente lee en la primera línea de entrada y sigue agregando las siguientes líneas una por una, sustituyendo cada vez la nueva línea con un espacio; después de que se agregue la última línea (y se \ncambie en un espacio), Nno se puede agregar ninguna línea, sfalla, tase omite, se alcanza el final del script y pse ejecuta la instrucción rint implícita en el espacio de patrón de 1 línea looong actual .

La -iopción sustituye el archivo de entrada filecon todo el espacio de patrón de 1 línea.


2

GEDIT:

Buscar y reemplazar \ncon un espacio ''.
Puede obtener la ventana de reemplazo yendo a 'Buscar' -> 'Reemplazar'
o mediante el acceso directo keybpard Ctrl+H

Ver captura de pantalla a continuación:

Su texto original está en las líneas 1-14.
El resultado está en la línea 16.

ingrese la descripción de la imagen aquí




0

Creo que simplemente estaba olvidando que necesitaba decirle a sed que redirija la salida de yourfile.txt al resultado deseado, newfile.txt. Este parece ser el comando que necesita, pero sólo si los archivos que están tratando de fusión no son demasiado grandes para los búferes de sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Acredite a otro foro aquí , donde discuten las capacidades de sed. He probado el comando y funcionó para mí.


1
En realidad, sed con el -iinterruptor modificará el archivo original en línea , por lo que no hay necesidad de enviarlo a otro archivo. ¡Pero ten cuidado!
ish

Intenté sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 ene 2008addustrial Estate sed -i: a -e N -e 's / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: no se puede encontrar la etiqueta para saltar a a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to ' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: no se puede leer s / \ n / /: No existe tal archivo o directorio #Cualquier idea.
John

@ Mik todavía no he tenido suerte, pero gracias por la respuesta.
John

Copié y pegué su texto en un editor de texto y guardé el archivo, luego usé mi comando sed e hizo que todo apareciera en una línea cuando se abrió en nano; sin embargo, si abre el archivo usando cat en el terminal, se envolverá y no parecerá ser solo una línea, así que quizás eso es lo que está sucediendo. Además, no necesita un 'antes de sed y creo que ha agregado algunos otros elementos innecesarios al comando anterior, así que intente sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Sin embargo, la línea es tan larga que aparecerá envuelta en la pantalla, ¡a menos que tenga un monitor de más de 30 pulgadas!

@Mik Saludos por la publicación. Escribí mis datos en un editor de texto, los guardé y ejecuté 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' y funcionó. perfectamente. Aleluya Luego escribí 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' y cada línea, aparte de la primera, tenía un espacio agregado al inicio de la línea. Le agradezco el esfuerzo que puso, pero creo que pasaré a la octava e intentaré procesar los datos allí.
John

0

Solución pura de bash:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt


0
vim <your_file>

Escriba dentro de vim y presione Entrar:

:% s/\n/ /g

0

Enfoque de Python:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.