Wie füge ich alle Zeilen einer Textdatei zu einer einzigen Zeile zusammen?


28

Ich möchte alle Zeilen eines Textes zu einer Zeile zusammenfassen. Ich bin ein Anfänger im Programmieren und versuche dabei zu lernen. Ich habe vier Stunden damit verbracht, dieses Problem zu lösen. Ich weiß, dass es für dieses Problem eine einfache Lösung gibt. Folgendes habe ich versucht.

sed -e 'N; s / \ n //' myfile.txt #Tut nichts

sed -e: a -e N -es / \ n / / '-e ta myfile.txt #output alles durcheinander und ich kann weder Kopf noch Schwanz der Syntax machen

Katze myfile.txt | tr -d '\ n'> myfile.txt # Löscht alle Zeilen

Hier ist die Textdatei:

500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
GRIFFITH LABORATORIES
SÜDDUBLIN COUNTY COUNCIL
BÜRO
BÜRO (INDUSTRIE)
Liste bewertbar
2 Industriegebiet von Pineview
Firhouse Road
Knocklyon
31. Dezember 2007
1. Januar 2008 "   

Ich kann nicht herausfinden, wo ich falsch gelaufen bin ...

Antworten:


31

trwie Sie es verwendet haben, sollte es funktionieren und ist das einfachste - Sie müssen nur in eine andere Datei ausgeben . Wenn Sie die Eingabedatei als Ausgabe verwenden, ist das Ergebnis eine leere Datei, wie Sie beobachtet haben.

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

Sie müssen sich daran erinnern, dass einige Editoren eine Zeile mit beenden \r\n. Verwenden Sie in diesem Fall

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

Vielen Dank für Ihre Hilfe, aber es funktioniert immer noch nicht. Ich weiß, dass es etwas Grundlegendes und Einfaches ist. Der Befehl, den Sie gaben, löschte alle Zeilen. Ich werde die Datei 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES Kreisrat Dublin - Süd OFFICE OFFICE (INDUSTRIAL) Liste bewertbar 2 Pineview Industrial Estate Firhouse Straße Knocklyon 31. Dezember 2007 1. Januar 2008 veröffentlichen
John

@JOhn: Was ist das Ergebnis oder der Fehler?
ish

Ich wollte posten, indem ich meine Antwort bearbeitete. Nachdem ich den Befehl verwendet hatte, war die Datei leer. So sah es im Terminal "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt" aus. Danke noch einmal.
John

@ John: Sie können nicht den gleichen Ausgabedateinamen verwenden !! (siehe Antwort). Bitte versuchen Sie escat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
Ein besserer Weg, dies zu tun, wäre tr -d '\n' <input.txt > output.txt, die nutzlose Verwendung von Katze zu vermeiden und eine unnötige Pfeife weniger zu verwenden.
Übelsuppe

8

Hier ist es. Es ist eine andere Lösung und einfach einfach.

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

2
Ich kann nicht glauben, dass dies funktioniert hat,
super

echo `cat Input.txt` > Output.txt funktioniert auch, nur eine andere varient
raider33

Wenn eine Unterteilung mehr als EIN Leerzeichen (Leerzeichen, Tabulator, Zeilenvorschub usw.) enthält, werden diese durch ein Leerzeichen ersetzt.
iBug

Dies ist eine schöne Lösung, aber auf meinem Computer dauert es ungefähr dreimal so lange wie die trLösung.
LS

3

EINFACHE METHODE

Eine andere Methode mit awk,

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

Ausgabe:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL) Liste Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 Dez 200701 Jan 2008 "

Hinweis:

ORS = '' -> Dies ist Ihr Feldtrennzeichen. Zwischen den einzelnen Anführungszeichen können beliebige Zeichen als Feldtrennzeichen stehen. Mit dieser awk-Methode können wir Leerzeichen und alle Zeichen einfügen.

Hoffe das könnte helfen!


1
ORS ist der Output Record Separator. OFS ist das Ausgabefeld-Trennzeichen. Siehe thegeekstuff.com/2010/01/… oderman awk
Elder Geek

3

Es ist nicht erforderlich, das Etikett :aaußerhalb der Hauptanweisung anzubringen, und es wird auch nicht die -eerforderliche Option benötigt. Schließlich ist das /$/überflüssig (jede Zeile hat einen EOL-Charakter).

Verbessert man andere Antworten, bekommt man

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

Was ist klarer, wenn wie folgt geschrieben,

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

Der Befehl funktioniert wie folgt:

  1. N fügt die nächste Zeile an den (mehrzeiligen) Musterraum an, der bereits die aktuelle Zeile enthält;
  2. s/\n/ /Ersetzen Sie das von \nerzeugte Zeilenumbruchzeichen durch Nein Leerzeichen .
  3. tawechselt in die dem Label folgende Skriptzeile :a , solange die Ersetzung in Schritt 2 erfolgreich war , dh wenn die Ersetzung stattgefunden hat, springt die Ausführung zu Schritt 1, ohne das Ende des Skripts zu "treffen", dh ohne eine andere Eingabezeile zu lesen.

Beachte das Folgende;

  • sedLiest die Zeilen der Eingabedatei nacheinander ab der ersten Zeile .
  • :a ist nur ein Label, kein auszuführender Befehl;
  • N wird grundsätzlich auf jeder Zeile ausgeführt, aber
  • s/\n/ /(im Prinzip auf jeder Zeile ausgeführt) erfolgreich ist auf jeder Linie , aber die letzten , so
  • tamacht das Ende des Skripts nur dann erreichbar , wenn die letzte Eingabezeile gelesen wird (die einzige Zeile, in der ein sFehler auftritt)
  • Es wird keine weitere Eingabezeile in den Musterraum eingelesen, nachdem die erste eingelesen wurde, es sei denn, die letzte Zeile wird eingelesen , es ist jedoch keine weitere Zeile einzulesen, und der implizite pBefehl wird ausgeführt.

Das Skript liest also im Grunde genommen die erste Eingabezeile ein und fügt die folgenden Zeilen nacheinander hinzu, wobei die neue Zeile jedes Mal durch ein Leerzeichen ersetzt wird. Nachdem die letzte Zeile angehängt wurde (und \nin einem Leerzeichen geändert wurde), Nkann keine Zeile angehängt werden, sschlägt fehl, tawird übersprungen, das Ende des Skripts wird erreicht und die implizite print-Anweisung wird für das aktuelle mehr als einzeilige Muster ausgeführt .

Die -iOption ersetzt die Eingabedatei filedurch den gesamten einzeiligen Musterbereich.


2

GEDIT:

Suchen und durch \nein Leerzeichen '' ersetzen .
Sie können das Ersetzen-Fenster über 'Suchen' -> 'Ersetzen'
oder über die Tastenkombination Ctrl+ aufrufenH

Siehe Screenshot unten:

Ihr Originaltext befindet sich in den Zeilen 1-14.
Das Ergebnis steht in Zeile 16.

Bildbeschreibung hier eingeben




0

Ich glaube, Sie haben einfach vergessen, dass Sie sed anweisen mussten, die Ausgabe von yourfile.txt auf das gewünschte Ergebnis, newfile.txt, umzuleiten. Dies scheint der Befehl , den Sie brauchen, sondern nur , wenn die Dateien , die Sie merge versuchen , nicht zu groß sind für Puffer sed ist: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Ein weiteres Forum , in dem die Fähigkeiten von sed diskutiert werden. Ich habe den Befehl getestet und es hat bei mir funktioniert.


1
Tatsächlich ändert sed mit dem -iSchalter die ursprüngliche Datei inline , sodass keine Ausgabe in eine andere Datei erforderlich ist. Sei aber vorsichtig!
ish

Ich habe versucht, sed -e: a -e N -es / \ n / / '-e ta reval_details.asp? Pno = 500214.txt 01 Jan 2008addustrial Estate sed -i: a -e N -es / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed: Die Bezeichnung für den Sprung zu 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 einem' sed -e: a -e N -i 's / \ n / /' -e ta reval_details kann nicht gefunden werden .asp? Pno = 500214.txt sed: kann s / \ n / / nicht lesen: Keine solche Datei oder Verzeichnis #Alle Ideen.
John

@Mik ich hatte noch kein glück aber danke für die antwort.
John

Ich habe Ihren Text kopiert und in einen Texteditor eingefügt und die Datei gespeichert. Dann habe ich meinen sed-Befehl verwendet und alles in einer Zeile angezeigt, wenn ich es in Nano öffne. Wenn Sie die Datei jedoch mit cat im Terminal öffnen, wird sie umgebrochen und scheint nicht nur eine Zeile zu sein. Vielleicht ist es das, was passiert. Außerdem brauchen Sie kein 'vor sed und ich denke, Sie haben dem obigen Befehl einige andere unnötige Elemente hinzugefügt, also versuchen Sie sed -e: a -e N -e' s / \ n / / '-e ta yourfile.txt> newfile.txt Die Zeile ist so lang, dass sie auf dem Bildschirm umbrochen erscheint, es sei denn, Sie haben einen 30-Zoll-Monitor!

@ Mik Cheers für die Post. Ich habe meine Daten in einen Texteditor eingegeben, sie gespeichert und 'sed -e: a -e N -e' s / \ n / / '-e ta abc.txt> abc1.txt' ausgeführt, und es hat funktioniert. perfekt. Halleluja. Dann habe ich 'sed -e: a -e N -e' s / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' eingegeben und jede Zeile außer der ersten hatte ein Leerzeichen am Zeilenanfang hinzugefügt. Ich weiß die Mühe zu schätzen, die Sie unternommen haben, aber ich denke, ich werde mich der Oktave zuwenden und versuchen, die Daten dort zu verarbeiten.
John

0

Reine bash Lösung:

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

0

Wenn ich es wäre, würde ich es einfach in vim öffnen und ein paar Mal Shift+ drücken J.


0
vim <your_file>

Geben Sie in vim ein und drücken Sie die Eingabetaste:

:% s/\n/ /g

0

Python-Ansatz:

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

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.