Angenommen, ich habe eine Textdatei wie:
john
george
james
stewert
mit jedem Namen in einer separaten Zeile.
Ich mag die Zeilen dieser Textdatei lesen und eine Textdatei für jeden Namen erstellen, wie: john.txt
, george.txt
usw.
Wie kann ich das in Bash machen?
command-line
bash
levato
quelle
quelle
Antworten:
# 1 Mit Bash +
touch
:while read line; [...]; done <in
: Dies wird ausgeführt,read
bis sichread
selbst zurückgibt. Dies1
geschieht, wenn das Ende der Datei erreicht ist. Die Eingabe fürread
wirdin
aufgrund der<in
Umleitung aus einer Datei gelesen, die im aktuellen Arbeitsverzeichnis benannt ist, und nicht aus dem Terminal .touch "$line.txt"
: Dies läufttouch
auf dem erweiterten Wert von$line.txt
, der der Inhalt vonline
gefolgt von ist.txt
;touch
erstellt die Datei, falls nicht vorhanden, und aktualisiert die Zugriffszeit, falls vorhanden;# 2 Mit
xargs
+touch
:-a in
:xargs
liest seine Eingabe aus einer Datei, diein
im aktuellen Arbeitsverzeichnis benannt ist;-I name
: lässtxargs
jedes Vorkommen vonname
durch die aktuelle Eingabezeile im folgenden Befehl ersetzen ;touch name
: Läufttouch
mit dem ersetzten Wert vonname
; Es erstellt die Datei, falls nicht vorhanden, und aktualisiert die Zugriffszeit, falls vorhanden.quelle
read line
die Zeile tatsächlich gelesen? @kos<in
nachdone
Fabrikateread
in derwhile
Schleifenbedingung lesen und speichert eine Zeile vonin
inline
jeder Iteration an; Auf diese Weise wird dastouch "$line.txt"
Innere der Schleife bis zur Lesezeile mit.txt
am Ende erweitert.while read line; do touch "$line.txt"; done <in
allein die Arbeit erledigen? Wo ist die Quelldatei?read
funktioniert das Sehenhelp read
.In diesem speziellen Fall, in dem Sie nur ein Wort pro Zeile haben, können Sie auch Folgendes tun:
Beachten Sie, dass dies fehlschlägt, wenn Ihre Dateinamen Leerzeichen enthalten können. Verwenden Sie in solchen Fällen stattdessen Folgendes:
Nur zum Spaß hier ein paar andere Ansätze (beide können beliebige Dateinamen verarbeiten, einschließlich Zeilen mit Leerzeichen):
Perl
Awk
Beachten Sie, dass die Erweiterung unter Linux und ähnlichen Systemen für die meisten Dateien optional ist. Es gibt keinen Grund
.txt
, einer Textdatei eine Erweiterung hinzuzufügen . Sie können dies tun, aber es macht überhaupt keinen Unterschied. Wenn Sie die Erweiterung trotzdem benötigen, verwenden Sie eine der folgenden Optionen:quelle
AWK ist auch für diese Aufgabe geeignet:
Ein anderer Weg
tee
. Beachten Sie, dass dieser Ansatz abbricht, wenn eine Zeile mehr als eine Zeichenfolge in der Dateiliste enthält.Alternativ
</dev/null tee $(cat filelist)
können Sie dies auch tun, wenn Sie Rohrleitungen vermeiden möchtencp /dev/null
Vorgehensweise (Wie ich demonstriere, funktioniert dies mit Dateinamen, die Leerzeichen enthalten):quelle
echo "" | tee file1 file2 file2
. Es funktioniert jedoch nicht, wenn Dateinamen Leerzeichen enthalten.Sagen wir mal, ich habe eine Antwort ;)
Wasserdicht auch mit Leerzeichen und Suffix =)
quelle