Ich habe eine Textdatei im folgenden Format:
001|fileA
002|fileA
003|fileA
004|fileB
005|fileB
006|fileC
.
.
.
xxx|fileX
Ich muss diese Datei in die Dateien aufteilen, die den einzelnen "|" entsprechen. Die Namen der neuen Dateien lauten wie DateiA, DateiB, DateiC ... DateiX.
Antwort1
versuchen
awk -F\| '{ print $1 > $2 ; }' file
Wo
-F\|
Sagen Sie awk, es als Trennzeichen zu verwenden|
. | muss maskiert werden.> $2
Drucken auf$2
den Wert umleiten.
bei vielen (> 10) Dateien:
for x in $(awk -F\| '!a[$2]++ { print $2}' file)
do
awk -F\| -v f="$x" '$2 == f { print $1}' file > "$x"
done
- zuerst awk lediglich eindeutige Dateinamen auflisten
- 52 Dateien sind in Ordnung, bei Hunderten von Dateien kann es jedoch langsam werden.
eine weitere Alternative, vorausgesetzt, die Felder können „sicher“ in die Shell eingefügt werden
awk -F\| '{printf "echo %s >> %s\n",$1,$2;}' file | bash
- Denken Sie daran, Datei X vorher zu löschen, falls Sie es erneut ausführen möchten.