Frage:
Kombinieren Sie mehrere Sendungen zu einer
KingBOB
2017-10-11 03:09:27 UTC
view on stackexchange narkive permalink

Ich versuche, mehrere Sendungen zu einer großen Datei zu kombinieren.Ich möchte, dass sie der Reihe nach angeordnet werden, aber dies scheint nicht richtig zu funktionieren.

Zu diesem Zeitpunkt habe ich vom Terminal aus versucht: cat * .txt >merged.txt , aber dies scheint die Dateien zufällig zu verketten.

In meinem Ordner befinden sich alle Dateien mit fortlaufenden Nummern (von 1.txt bis 10000.txt).Vermisse ich etwas?

Sechs antworten:
#1
+10
grg
2017-10-11 03:24:37 UTC
view on stackexchange narkive permalink

Globbing ist nicht zufällig, es ist garantiert alphabetisch (a.k.a. lexikografische Reihenfolge gemäß Ihrem Gebietsschema), was von der numerischen Sortierreihenfolge unterscheidet.

Hierfür können Sie die Klammererweiterung verwenden.Ersetzen Sie '10' durch die Nummer der letzten Datei.

  cat {1..10} .txt > fusioned.txt
 

Hierbei wird die Bash-Klammererweiterung verwendet, über die Sie unter LESS = '+ / Klammererweiterung' lesen können. man bash .

Beachten Sie, dass die Klammererweiterung im Gegensatz zu Dateikugeln beliebige Zeichenfolgen generiert, die keine vorhandenen Dateien sein müssen.In diesem Fall bedeutet dies, dass Sie Fehler erhalten, wenn Dateien in der Sequenz fehlen (z. B. wenn 7.txt nicht vorhanden ist).Dies hat jedoch keine Auswirkungen auf den Inhalt von merged.txt , der wie erwartet erstellt wird.

Dies ist unnötig quadratisch;`cat $ (für i in {1..10}; Echo" $ {i} .txt "; erledigt) >> fusioned.txt` ist vollkommen ausreichend.
Sie brauchen keine for-Schleife.Sie brauchen ein besseres Globbing von Dateien (wie es `zsh` hat).
@wchargin Danke, das ist ordentlicher, ich dachte, "{1..10}" wäre eine zsh-Sache, aber ich hätte darüber nachdenken sollen, wie die verschiedenen Argumente von cat so sind, wie sie verwendet werden sollen.
@Wildcard Sie haben Recht, haben gerade bemerkt, dass Sie auch eine Antwort gegeben haben, die positiv bewertet wurde
Vielen Dank;Ich habe den Befehl auch in dieser Antwort vereinfacht, um idiomatischer zu sein - ich hoffe, es macht Ihnen nichts aus.:) So würde ich es mit bash machen;upvoted.
@Wildcard Sie haben natürlich Recht, dass ein besseres Globbing einer for-Schleife überlegen ist.Ich habe einfach nie daran gedacht, die Klammererweiterung als Bestandteil eines größeren Wortes zu verwenden.Danke für die Verbesserung.
#2
+3
Wildcard
2017-10-11 05:09:41 UTC
view on stackexchange narkive permalink

Verwenden Sie zsh mit erweiterten Globs - und enable numerische Sortierung der Glob-Erweiterungen mit dem Glob-Qualifikationsmerkmal (n) :

  zsh -c 'cat * .txt (n) > fusioned.txt'
 

Sie können Ihre Globs genauer festlegen, auch:

  zsh -c 'cat <1-10000>.txt (n) > fusioned.txt'
 

Ausführliche Informationen finden Sie unter man zshexpn .

Wenn Sie die Option "Multios" eingestellt haben, können Sie die "Katze" überspringen und einfach "<*. Txt (n)> Merged.txt" (oder "<*. Txt ~ Merged.txt (n)> Merged.txt" verwenden`falls es schon existiert)
Es ist höchst unwahrscheinlich, aber was passiert, wenn die Erweiterung ein Literal ".txt (n)" ist?
@JAB stimmt nicht überein.Versuch es.
#3
+2
musicman523
2017-10-11 10:56:26 UTC
view on stackexchange narkive permalink

Eine andere mögliche Antwort könnte sein:

  ls |sort -n |xargs cat > fusioned.txt
 


Auf einem GNU / Linux-System können Sie ls -v | ausführenxargs cat > fusioned.txt , dies ist jedoch spezifisch für die GNU-Version von ls und funktioniert nicht für BSD ls . sup>

-1, `ls -v` * auf einem Mac * macht etwas völlig anderes als` ls -v` unter Linux.Mac verwendet BSD-Tools und `-v` zum numerischen Sortieren von Dateien ist nur eine Funktion von GNU` ls`.Für BSD "ls" bedeutet "-v" "unbearbeitetes Drucken von nicht grafischen Zeichen erzwingen";Dies ist die Standardeinstellung, wenn die Ausgabe nicht an ein Terminal erfolgt. "
Mein schlechtes, ich werde meine Antwort aktualisieren, um das zu reflektieren.
#4
+1
equinoxe5
2017-10-11 03:17:29 UTC
view on stackexchange narkive permalink

Kopf hoch.Wenn die Dateien tatsächlich von 1 bis 10000 nummeriert sind, sortiert das Betriebssystem Ihre Dateien in der Reihenfolge der ersten Nummer: 1.txt 11.txt 12.txt ... 19.txt 100.txt ... 2.txt 20.txt 21.txt

usw.

Sie müssten Dateien in 00001, 00002 usw. umbenennen.

Nebenfrage: Schneller Weg dazu?Automator?Terminal?
* .txt 0000 * .txt umbenennen?
@Brandito, Kein Befehl wie "Umbenennen" bei einer Standard-Mac-Installation.Und selbst unter Linux funktioniert der von Ihnen geschriebene Befehl nicht.Es gibt [verschiedene inkompatible Syntaxen für "Umbenennen" in verschiedenen Linux-Distributionen] (https://unix.stackexchange.com/a/238862/135943).
#5
+1
glenn jackman
2017-10-11 05:36:29 UTC
view on stackexchange narkive permalink

Normalerweise analysieren Sie die Ausgabe von ls nicht, aber da Ihre Dateinamen keine Leerzeichen oder "ungewöhnlichen" Zeichen enthalten, können wir dies tun:

  shopt -s extglob
ls + ([0-9]). txt |sort -n |xargs cat > fusioned.txt
 

Der + ([0-9]) ist ein erweitertes erweitertes Glob-Muster, das nur einer oder mehreren Zahlen entspricht.

Mit GNU ls (verfügbar über Homebrew im Paket coreutils)

  ls -v + ([0-9]). txt |xargs cat > fusioned.txt
 
#6
-4
Alex
2017-10-11 07:39:46 UTC
view on stackexchange narkive permalink

In der Eingabeaufforderung:
cd "Pfad zum Verzeichnis" (Enter)
Kopieren Sie * .text result.txt (Enter)

Ich bin mir nicht sicher, ob das eine Windows-Sache ist, aber `copy` ist unter macOS nicht einmal ein Befehl, und` cp` funktioniert so nicht.Siehe die anderen Antworten.
Was @Kevin gesagt hat ... Ich kann mich nicht erinnern, diese Methode verwendet zu haben, um Dateien in Windows zu * verketten *, daher weiß ich nicht, wie Sie zu dieser Antwort gekommen sind.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...