Ich habe eine Reihe von .text
Dateien, von denen die meisten mit dem Standard nl enden.
Ein Paar hat am Ende keinen Terminator. Das letzte physikalische Byte ist (im Allgemeinen) ein alphabetisches Zeichen.
Ich habe verwendet cat *.text >| /tmp/joined.text
, aber dann einige Stellen in join.text bemerkt, an denen die erste Zeile einer Datei am Ende der letzten Zeile einer vorherigen Datei erschien. Bei der Überprüfung der vorherigen Datei stellte ich fest, dass es keinen Zeilenabschluss gab - die Verkettung wurde erklärt.
Das warf die Frage auf, was der einfachste Weg ist, sich zu verketten und in der fehlenden Newline zu bleiben. Was ist mit diesen Optionen?
- Eine Lösung, die einigen Eingabedateien möglicherweise eine leere Zeile hinzufügt. Für mich ist das kein Problem, da die Verarbeitung von join.text damit umgehen kann.
- Eine Lösung, die cr / fl nur zu Dateien hinzufügt, die noch nicht so enden.
shell
text-processing
cat
newlines
HiTechHiTouch
quelle
quelle
while
diese fehlerhaften letzten Zeilen überspringt.\n
? Auf * nix-Systemen enden die Zeilen mit einem einzigen\n
. Das\r\n
ist eine Windows-Sache. Und wo willst du das? Am Ende jeder Zeile? Das Ende der Datei?Antworten:
Ein weiterer Befehl, der bei Bedarf Zeilenumbrüche hinzufügen kann, lautet
awk
:Die 1 hier ist der einfachste Weg, um eine wahre Bedingung in awk zu erhalten, was für diesen Zweck funktioniert, da die Standardaktion von awk unter wahren Bedingungen darin besteht, die Eingabezeilen zu drucken.
quelle
1
ist die einfachste wahre Bedingung. Es ist eine Abkürzung fürawk '{print}'
Mit einigen
cut
Implementierungen wie GNUcut
können Sie Folgendes tun:da es die fehlende neue Zeile hinzufügt, wenn sie fehlt.
quelle
Dieser handliche Perl-Einzeiler kann den fehlenden Zeilenumbruch nur hinzufügen, wenn er noch nicht vorhanden ist:
quelle
Der erste Ansatz, der mir in den Sinn kommt, besteht darin, die Dateien zu durchlaufen und ihren Inhalt mit einer angehängten neuen Zeile zu drucken:
Das
$()
wird alle bereits vorhandenen Zeilenumbrüche Streifen so diese nur zur Folge wird\n
am Ende jeder Datei.quelle
\n
und eine hinzugefügt. Das Ergebnis ist immer eins (und nur eins)\n
am Ende jeder Datei. Das%s
ist eineprintf
Sache, es bedeutet nur "String". Siehe hier . Sie verwechseln es mit[ -s file ]
der Größe der Datei. Dies gilt sowohl für Option 1 als auch für Option 2. Nein, für ein Dienstprogramm gibt es keine, da jedes Programm, das in eine Datei schreibt, immer eine neue Zeile hinzufügt. Wenn es keine gibt, liegt das fast immer daran, dass etwas kaputt gegangen ist und die Datei beschädigt ist.zsh
wird es an NUL-Zeichen ersticken. Es sollte wahrscheinlich auch beachtet werden, dass es die gesamten Dateien in den Speicher lädt.Sie könnten dies verwenden:
-h entfernt den Ausdruck des Dateinamens
quelle