Zu machen, wie die Katze eine neue Zeile beginnen
Habe ich vier Dateien:
one_file.txt
abc | def
two_file.txt
ghi | jkl
three_file.txt
mno | pqr
four_WORD.txt
xyz| xyz
Ich verketten möchten alle Dateien mit der Endung "file.txt" (d.h. alle außer four_WORD.txt), um zu erhalten:
abc | def
ghi | jkl
mno | pqr
Um dies zu erreichen, habe ich ausgeführt:
Katze *file.txt > full_set.txt
Jedoch full_set.txt raus kommt:
abc | defmno | pqrghi | jkl
Irgendwelche Ideen, wie dies zu tun, richtig und effizient, so dass jeder endet an seiner eigenen Linie? In der Realität, ich brauche die, die oben für eine Menge von sehr großen Dateien. Vielen Dank im Voraus für Eure Hilfe.
- Hinzufügen end-of-line-Zeichen an das Ende jeder Datei. Sie sollen da sein.
- Abhängig von den Dateien, das könnte nicht sein, überhaupt nicht machbar. Es gibt viele Szenarien, in denen Sie möchten, können Sie zum verketten von Dateien mit newlines zwischen Ihnen, ohne Sie zu addieren, um die input-Dateien.
- Eine Textdatei ist eine Folge von Zeilen. Dies wird durch POSIX. Eine Zeile endet mit dem newline-Zeichen. (Eine alternative Sicht, dass die neue-Zeile-Zeichen trennt, anstatt beendet, Linien, ist theoretisch möglich, aber die Ergebnisse in ein Chaos).
- Unabhängig von POSIX, gibt es Situationen, wo das, was Sie haben, ist nicht eine POSIX-text-Datei, die Sie dennoch nützlich sein, zu manipulieren, mit standard-tools.
- Wenn es keine text-Datei, dann ruft es
*txt
ist wahrscheinlich nicht eine gute Idee. Jedenfalls, wenn Sie nicht-standard-Dateien, haben Sie Probleme, wenn Sie mit standard-tools. Umgang Probleme eins nach dem anderen, ist eine Möglichkeit, den Umgang mit dem problem, die Umstellung auf ein standard-format ist ein anderes, weder ist universell gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen:
Dies ist weniger effizient, dass ein nackten
cat
wird aber ein extra\n
wenn Sie fehlt am Ende jeder DateiViele tools hinzufügen Zeilenumbrüche, wenn Sie fehlen. Versuchen Sie z.B.
aber dies hängt von Ihrem
sed
version. Andere versuchen Awkgrep -ho '.*' file*.txt
usw.Können Sie mit einer Schleife über jede Datei und machen Sie einen check, um zu sehen, wenn die Letzte Zeile endet in einer neuen Zeile ausgeben, wenn es nicht.
[\x0a]
ist keine gültige Methode zur Darstellung von einem newline-Zeichen, und die Kommando-substitution wird trim keine abschließende newline von der Ausgabe sowieso. Ich nehme an, es könnte umgangen werden durch die Verwendungtail | xxd
und vergleichen Sie die hex-Ausgabe*0a
aber das ist immer ziemlich gequält, schon.cat
fügt die fehlenden Zeilenumbrüche aus der Luft gegriffen. In dem Fall die OP ' s viel einfachercat *file.txt
gearbeitet haben würde, auch gutKönnen Sie eine Zeile
for
Schleife für diese. Die folgende Zeile:Ergibt sich die gewünschte Ausgabe:
Auch möglich doppelte.
cat
auf eine Datei gleichzeitig in einem Teilprozess tut nichts, um fügen Sie einen Zeilenumbruch, wenn eine fehlt, und das ist sehr verschwenderisch. Sie testen mit input-Dateien, die nicht fehlt, ist die Letzte Zeile.{ cat; echo; }
vs Ihre(cat)
) und verwendetecho
hinzufügen ein Zeilenumbruch, auch wenn der eine darf nicht fehlen.cat
Vorgang nicht ergeben das gleiche Ergebnis wie bei mir.diese funktioniert bei mir:
Ich hoffe das wird Ihnen helfen.
echo ;
echo
hinzufügen, welches ist der Punkt hier.juju@juju-laptop:~/tmp$ for f in *_file.txt; do (cat "${f}") >> full_set.txt; done juju@juju-laptop:~/tmp$ cat full_set.txt abc | defmno | pqrjhi | jkljuju@juju-laptop:~/tmp$
gut, auf meinem computer funktioniert es nicht, es gibt kein Ende newline auf die einzelnen Dateien !cat *file.txt
das gleiche wie der Autor ?ls
ls *
aber es'ls *file.txt
. wenn Sie versuchenfor file in *file.txt ...
Sie nicht erwarteten Ergebnis (ich bin mit der bash 5.0.9 auf archlinux)for file in *file.txt
ist falsch?Die shell erweitert den wildcard-vorls
läuft. Lesen Sie den link, den ich zur Verfügung gestellt.