it-swarm.com.de

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

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 -e 's/\ n// '-e ta myfile.txt #output alles durcheinander und ich kann weder Kopf noch Schwanz der Syntax machen 
 
 cat 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 (INDUSTRIAL) 
 Liste Rateable 
 2 Pineview Industrial Estate 
 Firhouse Road 
 Knocklyon 
 31. Dezember 2007 [.____. ____.] 1. Januar 2008 "

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

28
John

tr wie Sie es benutzt haben sollte funktionieren und ist am einfachsten - 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 \r\n abschließen. Verwenden Sie in diesem Fall

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

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

echo $(cat Input.txt) > Output.txt
8
αғsнιη

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 "

Anmerkung:

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

Hoffe das könnte helfen!

3
M.S.Arun

Es ist nicht erforderlich, das Label :a außerhalb der Hauptanweisung zu platzieren, und die Option -e ist nicht erforderlich. Schließlich ist der /$/ ü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 N generierte Zeilenumbruchszeichen \n durch ein Leerzeichen.
  3. ta wechselt in die Skriptzeile nach dem Label :asolange die Ersetzung in Schritt 2 erfolgreich war, ie Wenn die Substitution stattgefunden hat, springt die Ausführung zu Schritt 1, ohne das Ende des Skripts zu "treffen". dh ohne Lesen einer anderen Eingabezeile.

Beachte das Folgende;

  • sed liest die Zeilen der Eingabedatei nacheinander, ab der ersten Zeile;
  • :a ist nur eine Bezeichnung, kein auszuführender Befehl.
  • N wird grundsätzlich in jeder Zeile ausgeführt, aber
  • s/\n/ / (im Prinzip in jeder Zeile ausgeführt) ist erfolgreich in jeder Zeile außer der letzten, also
  • ta macht das Ende des Skripts erreichbar nur wenn die letzte Eingabezeile gelesen wird (die einzige Zeile, in der s fehlschlägt), also
  • nach dem Einlesen von 1. wird keine weitere Eingabezeile in den Musterraum eingelesen, es sei denn, letzte wird eingelesen, es ist jedoch keine weitere Zeile zum Einlesen vorhanden und der implizite Befehl p wird ausgeführt.

Das Skript liest also im Grunde genommen das 1. Zeile der Eingabe ein und fügt die folgenden Zeilen nacheinander hinzu, wobei die neue Zeile jedes Mal durch ein Leerzeichen ersetzt wird. Nachdem das letzte Zeile angehängt wurde (und \n in einem Leerzeichen geändert wurde), kann N keine Zeile anhängen, s schlägt fehl, ta wird übersprungen, das Ende des Skripts wird erreicht und die implizite Anweisung print wird für den aktuellen laaangen einzeiligen Musterbereich ausgeführt.

Die Option -i ersetzt die Eingabedatei file durch den gesamten einzeiligen Musterbereich.

Ich denke, der einfachste Weg, dies zu tun, ist:

paste -s -d:" " test.txt

http://ss64.com/bash/paste.html

2
JConstenla

GEDIT:

Suchen und ersetzen Sie \n durch ein Leerzeichen ''.
Sie können das Ersetzen-Fenster erhalten, indem Sie auf "Suchen" -> "Ersetzen" gehen.
oder über die Tastenkombination Ctrl+H

Siehe Screenshot unten:

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

enter image description here

2
Parto

Versuche dies

sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/

1
Anand Rajasekar

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  
0
vim <your_file>

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

:% s/\n/ /g
0
Anatoly

Reine bash Lösung:

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

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 zu sein, den Sie benötigen, aber nur, wenn die Dateien, die Sie zusammenführen möchten, nicht zu groß für die Puffer von sed sind: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. Dank an ein weiteres Forum hier , wo die Fähigkeiten von sed besprochen werden. Ich habe den Befehl getestet und es hat bei mir funktioniert.

0
user76204

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

0
thomasrutter