2017-12-19 2 views
0

ich eine Textdatei, die Shell-Skript Textdatei in mehrere Dateien aufgeteilt

file1 value1 
file1 value2 
file2 value1 
file2 value2 
file2 value3 

Ich möchte spaltete die Textdatei in mehrere Dateien mit den Dateinamen von column1 und column2 als Inhalt der Dateien wie

aussieht , wie

file1_new.txt 
value1 
value2 

file2_new.txt 
value1 
value2 
value3 

Ich habe es mit dem folgenden Skript versucht, aber das funktioniert nicht. Kann mir bitte jemand helfen, das Skript neu zu schreiben?

cat input.txt | while read file value; do 
    echo "$value" > "$file"_new.txt 
done 

Antwort

3

Die Datei nicht überschreiben. Fügen Sie in die Datei stattdessen:

cat input.txt | while read file value; do 
    echo "$value" >> "$file"_new.txt 
done 

Hinweis mein Wechsel von > zu >>, was bedeutet, „an die Datei anhängen“. Wenn Sie die Datei > verwenden, wird ihr Inhalt gelöscht, bevor der aktuelle Befehl seine Ausgabe in die Datei schreibt, so dass die Dateien den letzten Wert enthalten. Wenn Sie >> verwenden, wird der Inhalt der Datei nicht gelöscht und neue Ausgabe wird an das Ende der Datei angehängt, was Sie wollen.

0

echo "$value" > "$file"_new.txt erstellt jedes Mal eine neue $ file_new.txt, in die $ value geschrieben wird.

Sie möchten den Operator >> verwenden, um jeden $ -Wert an $ file anzuhängen.

Siehe the bash manual on redirections

1

Sie dieses awk verwenden:

$ awk '{print $2 > $1 "_new.txt"}' file 

Da es offen lässt alle Dateien, die Sie aus fds laufen. In diesem Fall sollten Sie die Dateien nach jedem Schreib close() und die > zu >> ändern zum Anhängen:

$ awk '{print $2 > $1 "_new.txt"; close($1 "_new.txt")}' file 

Natürlich, wenn die file auf $1 Sie die Ausgabedatei zu close() nur sortiert müssen, sobald sie sich ändert.

Verwandte Themen