2017-03-23 2 views
0

Ich habe eine Textdatei, itemlist.txt, die aus einer Liste von Strings wie so zusammen:Wie fügt man Dateiname an jede Textdatei an, die in ... einer Textdatei aufgeführt ist?

Item1 
Item2 
Item3 
Item4 
... 

Jeder String in eine Textdatei entspricht (alle mit derselben Dateierweiterung) im selben Verzeichnis wie die Liste . Mit anderen Worten, Item1 in der Liste bedeutet Item1.txt im selben Verzeichnis und so weiter.

Was ist eine effiziente Methode, um diese Liste zum Bearbeiten jeder Datei zu verwenden und den Dateinamen jeder Datei mit einem Bash-Shell-Skript an sich selbst anzuhängen? Mit anderen Worten, "Item1" sollte die letzte Zeile von Item1.txt usw. sein.

Ich habe GUI-basierte Workflow-Tools, um diese Textdateien weiter zu manipulieren, sobald die Zeichenfolgen vorhanden sind, aber ich habe viel zu lernen über Bash und das hat mich ratlos gemacht. Im Idealfall möchte ich ein Skript schreiben, das benutzerdefinierte Argumente akzeptiert, um in die Dateien mit dem Dateinamen zu schreiben, aber ... Baby Schritte!

Ich denke, sed ist besser für diese als echo, in Bezug auf die Manipulation der Textdateien, aber ich habe Probleme mit der Textdatei ordnungsgemäß durchlaufen.

+0

versuchen '/.*/&‚s sed txt /. 'Eingabedatei' oder 'awk' $ 0 = $ 0 ".txt" 'Eingabe' –

Antwort

2

Sie eine einfache read Schleife für diese verwenden können angehängt werden soll:

while read -r item; do 
    file="$item.txt" 
    [[ ! -f "$file" ]] && continue # skip if file doesn't exist or if it is not a regular file 
    printf '%s\n' "$item" >> "$file" 
done < itmelist.txt 
+0

Dies funktioniert im allgemeinen Fall mit Testdaten gut. Wenn ich es auf meinen speziellen Fall anwende, stoße ich auf ein Problem (denke ich), weil die eigentlichen Textdateien so benannt sind, dass Zeile 2 wie folgt aussehen muss: file = "$ item_foo.txt" 'wobei foo für die gleiche ist ganze Charge. Dieser Code funktioniert jedoch nicht (ich denke, der Unterstrich muss maskiert sein?). Wenn ich '_foo' am Ende eines Elements in der Textdatei anfüge, funktioniert es. –

+0

'file =" $ {item} _foo.txt "' würde es tun. – codeforester

+0

Es tut bestimmt! –

3

Echo ist wahrscheinlich die einfachste, da Sie

while read f; do 
    echo "$f" >>"$f.txt" 
done <itemlist.txt 
Verwandte Themen