Come faccio a combinare tutte le righe di un file di testo in un'unica riga?


28

Voglio mettere tutte le righe di un testo in una riga. Sono un principiante nel programmare cercando di imparare facendo. Ho trascorso quattro ore a cercare di risolvere questo problema. So che esiste una soluzione semplice a questo problema. Ecco cosa ho provato.

sed -e 'N; s / \ n //' myfile.txt #Non fa nulla

sed -e: a -e N -e 's / \ n / /'-ta ta myfile.txt #output tutto incasinato e non riesco a fare la testa né la coda della sintassi

cat myfile.txt | tr -d '\ n'> myfile.txt # Elimina tutte le righe

Ecco il file di testo:

500.212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
LABORATORI DI GRIFFITH
CONSIGLIO DELLA CONTEA DEL SUD DUBLINO
UFFICIO
UFFICIO (INDUSTRIALE)
Elenco riferibile
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 dic 2007
01 gen 2008 "   

Non riesco a capire dove ho sbagliato ...

Risposte:


31

trcome hai usato dovrebbe funzionare ed è il più semplice: devi solo eseguire l' output su un altro file . Se si utilizza il file di input come output, il risultato è un file vuoto come osservato;

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

Devi ricordare che alcuni editor terminano una riga con \r\n. In tal caso, utilizzare

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

Grazie per l'aiuto, ma non funziona ancora. So che è qualcosa di semplice e basilare. Il comando che hai dato ha eliminato tutte le righe. Ho intenzione di pubblicare il file 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES SOUTH DUBLIN COUNTY COUNCIL OFFICE OFFICE (INDUSTRIAL) Elenco Rateable 2 Pineview Industrial Estate Firhouse Road Knocklyon 31 dic 2007 01 gen 2008
John

@JOhn: qual è il risultato o l'errore?
Ish,

Stavo per pubblicare modificando la mia risposta. Dopo aver usato il comando il file era vuoto. Sembrava così nel terminale "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt". Grazie ancora.
Giovanni,

@John: non puoi usare lo stesso nome del file di output !! (vedi risposta). Si prega di provarecat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
Un modo migliore per farlo sarebbe tr -d '\n' <input.txt > output.txt: quello di evitare l'uso inutile del gatto e usare una pipa in meno inutile.
evilsoup,

8

Ecco qui. È un'altra soluzione e semplice facile.

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

2
non posso credere che abbia funzionato, fantastico
mchid

echo `cat Input.txt` > Output.txt funziona anche solo un'altra
varietà

Se ci sono più di UNO spazi bianchi (spazio, tab, newline e così via) in una singola divisione, saranno sostituiti da uno spazio.
iBug

Questa è una buona soluzione, ma sul mio computer ho scoperto che ci vuole circa tre volte più tempo per funzionare come la trsoluzione.
LS,

4

METODO SEMPLICE

Un altro metodo che utilizza awk,

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

Produzione:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Elenco Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 dic 200701 gen 2008 "

Nota:

ORS = '' -> Questo è il separatore di campo, puoi avere qualsiasi carattere tra le virgolette singole come separatore di campo. Usando questo metodo awk possiamo includere spazi e tutti i caratteri.

Spero che questo possa aiutare!


1
ORS è il separatore del record di output. OFS è il separatore del campo di uscita. Vedi thegeekstuff.com/2010/01/… oman awk
Elder Geek l'

3

Non è necessario mettere l'etichetta :aal di fuori dell'istruzione principale, né è -enecessaria l' opzione necessaria; infine, /$/è superfluo (ogni riga ha un carattere EOL).

Migliorando altre risposte, si ottiene

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

Che è più chiaro se scritto come segue,

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

Il comando funziona come segue:

  1. N aggiunge la riga successiva allo spazio del pattern (multilinea), che contiene già la riga corrente;
  2. s/\n/ /sostituire il carattere newline \ngenerato da Ncon uno spazio ;
  3. tapassa alla riga dello script seguendo l'etichetta :a finché la sostituzione nel passaggio 2 ha avuto esito positivo , ovvero se si è verificata la sostituzione, l'esecuzione passa al passaggio 1 senza "colpire" la fine dello script, ovvero senza leggere un'altra riga di input.

Nota quanto segue;

  • sedlegge le righe del file di input una per una in ordine, a partire dalla prima riga ;
  • :a è solo un'etichetta, non un comando da eseguire;
  • N è, in linea di principio, eseguito su qualsiasi linea, ma
  • s/\n/ /(in linea di principio eseguito su qualsiasi riga) ha esito positivo su qualsiasi riga tranne l'ultima , quindi
  • tarende la fine dello script raggiungibile solo quando viene letta l'ultima riga di input (l'unica riga dove sfallisce), quindi
  • nessuna ulteriore riga di input viene letta nello spazio del pattern dopo che la prima è stata letta in essa, a meno che non sia stata letta l' ultima , ma non ci sono ulteriori righe da leggere e il pcomando implicito viene eseguito.

Quindi lo script legge sostanzialmente nella prima riga di input e continua ad aggiungere le righe seguenti una per una, sostituendo ogni volta la nuova riga con uno spazio; dopo che l' ultima riga è stata aggiunta (e \nmodificata in uno spazio), Nnon è possibile aggiungere alcuna riga, snon riesce, taviene saltata, viene raggiunta la fine dello script e l' pistruzione rint implicita viene eseguita sull'attuale spazio del motivo a 1 riga .

L' -iopzione sostituisce il file di input filecon l'intero spazio del motivo a 1 riga.


2

gedit:

Cerca e sostituisci \ncon uno spazio ''.
Puoi ottenere la finestra di sostituzione andando su "Cerca" -> "Sostituisci"
o tramite la scorciatoia da tastiera Ctrl+H

Vedi lo screenshot qui sotto:

Il testo originale è alle righe 1-14.
Il risultato è sulla linea 16.

inserisci qui la descrizione dell'immagine




0

Penso che stavi semplicemente dimenticando che dovevi dire a sed di reindirizzare l'output di yourfile.txt al risultato desiderato, newfile.txt. Questo sembra essere il comando è necessario, ma solo se i file che si sta tentando di fusione non sono troppo grandi per i buffer di sed: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Ringraziamo un altro forum qui , dove discutono delle capacità di sed. Ho testato il comando e ha funzionato per me.


1
In realtà, sed con l' -iopzione modificherà il file originale in linea , quindi non è necessario eseguire l'output su un altro file. Stai attento però!
Ish,

Ho provato sed -e: a -e N -e 's / \ n / /' -e ta reval_details.asp? Pno = 500214.txt 01 gen 2008adustrial Estate sed -i: a -e N -e '/ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: impossibile trovare l'etichetta per saltare 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 un' sed -e: a -e N -i 's / \ n / /' -e ta reval_details .asp? Pno = 500214.txt sed: impossibile leggere s / \ n / /: nessun file o directory # Qualsiasi idea.
Giovanni,

@Mik Non ho ancora avuto fortuna ma grazie per la risposta.
Giovanni,

Ho copiato e incollato il testo in un editor di testo e salvato il file, quindi ho usato il mio comando sed e lo ha fatto apparire su una riga quando aperto in nano; tuttavia, se apri il file usando cat nel terminale, questo verrà spostato e non sembrerà essere solo una riga, quindi forse è quello che sta succedendo. Inoltre, non hai bisogno di un 'prima di sed e penso che tu abbia aggiunto altri elementi non necessari al comando sopra, quindi prova sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt La linea è così lunga da apparire sullo schermo, tuttavia, a meno che tu non abbia un monitor da 30 pollici!

@Mik Cin cin per il post. Ho digitato i miei dati in un editor di testo, li ho salvati ed ho eseguito 'sed -e: a -e N -e' s / \ n / / '-ta ta abc.txt> abc1.txt' e ha funzionato. perfettamente. Hallelujah. Ho quindi digitato 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' e ogni riga a parte la prima aveva un spazio aggiunto all'inizio della riga. Apprezzo lo sforzo che hai fatto ma penso che passerò all'ottava e proverò ad elaborare i dati lì.
Giovanni,

0

Pura soluzione di bash:

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


0
vim <your_file>

Digita in vim e premi Invio:

:% s/\n/ /g

0

Approccio Python:

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

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.