Extrahieren von Wörtern aus .txt und Erstellen eines Master-.txt

1

Ich habe mehrere .txt-Dateien, die Namen von Personen enthalten, die alphabetisch sortiert sind. So habe ich beispielsweise im Hauptverzeichnis das Verzeichnis a, das eine a.txt-Datei mit Namen enthält, die mit "a" wie "Anna", "Andrew" usw. beginnen. Dasselbe Wiederholungen im Hauptverzeichnis Ich habe das Verzeichnis b, das die Datei b.txt mit Namen usw. enthält, bis x, y, z. Wie kann ich die Namen extrahieren und eine master.txt erstellen, die die Namen aller Personen enthält?

Alex
quelle

Antworten:

2

Dies erreichen Sie mit dem Befehl cat und der Dateinamenerweiterung . Wenn sich alle diese Dateien im Quellverzeichnis /path/to/directorybefinden und sich keine anderen Dateien in diesem Verzeichnis befinden, ist der prägnanteste Befehl der folgende:

cat /path/to/directory/*/*.txt > master.txt

Dadurch wird eine Datei erstellt, die master.txtin Ihrem aktuellen Verzeichnis aufgerufen wird und den verketteten Inhalt aller Dateien im Quellverzeichnis enthält. HINWEIS: Dies schließt alle Dateien in einem der Unterverzeichnisse des Quellverzeichnisses ein.

Wenn das Verzeichnis andere Dateien enthält (oder wenn Sie nur ein bisschen genauer sein möchten), können Sie stattdessen den folgenden Befehl verwenden:

cat /path/to/directory/[a-z]/[a-z].txt > master.txt

Dies entspricht nur den folgenden Dateien im Quellverzeichnis:

a/a.txt
a/b.txt
a/c.txt
.
.
.
z/x.txt
z/y.txt
z/z.txt

Wenn sich andere Dateien im Quellverzeichnis befinden oder wenn Sie Dateien haben, die denen ähneln, bei a/z.txtdenen der Name des Unterverzeichnisses nicht mit dem Basisnamen der Datei übereinstimmt, und wenn Sie diese Dateien ausschließen möchten, müssen Sie verwenden Ein genauerer Befehl, um die Liste der gefundenen Dateien einzugrenzen. In diesem Fall könnten Sie eine Klammererweiterung und eine for-Schleife verwenden :

for letter in {a..z}; do \
    cat "/path/to/directory/${letter}/${letter}.txt"; \
done >> master.txt

Dies entspricht genau den Dateien, die Sie in Ihrer Frage angegeben haben, und keinen anderen Dateien.

igal
quelle
0

Ersetzen Sie main_dirdurch den Pfad zu Ihrem Hauptverzeichnis, speichern Sie dieses in einem Skript und führen Sie es vom Terminal aus als aussh ./script-name.sh

#!/bin/bash
for i in $( cd main_dir && ls ); do
    cat "main_dir/$i/$i.txt" >> "master.txt"
done
Scheiß
quelle
1
Es gibt keinen Grund, die Ausgabe von lsin dieser Situation zu analysieren , da Globbing / Dateinamenerweiterung genauso gut funktionieren wird. Das Parsen der Ausgabe von lswird im Allgemeinen als schlechte Praxis angesehen. Weitere Informationen zu diesem Thema finden Sie unter Warum Sie die Ausgabe von ls nicht analysieren sollten .
19.