Wie kann man Text zwischen Trennzeichen in mehrere Dateien aufteilen?

7

Ich habe eine Textdatei mit folgendem Inhalt:

"random
textA"
"random
random
textB"

Das Trennzeichen ist "

Wie kann ich den Containt mit einem Bash-Befehl wie folgt in mehrere Dateien aufteilen?

Datei 1:

random
textA

Datei 2:

random
random
textB

Ich bin auf Beispiele mit csplitoder gekommen, awkaber sie decken dieses Textlayout nicht ab.

Fabio
quelle
Ist das der einzige Text in der Datei?
Hauke ​​Laging
ja nur Text in der Datei
Fabio

Antworten:

5

Einfacher awkBefehl:

awk 'NR%2==0{ print > "File "++i }' RS='"' file

RSdefiniert "als Datensatztrennzeichen und NRist die Datensatznummer. Wenn die Datensatznummer Modulo von 2 war (weil wir zuerst eine andere "für Datensätze haben), drucken Sie den aktuellen Datensatz $0in a File #.

αғsнιη
quelle
1
Dies ist IMO die beste Antwort, da es auch dann funktioniert, wenn andere Zeilen zwischen "$und der nächsten existieren ^".
don_crissti
Ich brauche den Anfang nicht, ++isondern nur anstelle von i++.Kann aufawk 'NR%2==0{ print >"File "++i }' RS='"' file
@ Jidder Äh, ja. Vielen Dank. aktualisiert damit,
αғsнιη
4

Wenn sich das Eröffnungszitat immer am Anfang der Zeile befindet, funktioniert csplit wie folgt:

bash$ csplit /tmp/data '/^"/'

Dadurch werden Dateien mit dem Namen xx00 usw. erstellt. Beachten Sie, dass in Ihrem Beispiel die Anführungszeichen entfernt werden und dies nicht der Fall ist. Dazu benötigen Sie eine Befehlszeile:

bash$ for file in xx* ; do { sed 's/^"//;s/"$//;' ${file} >x${file}; } ; done
nash ef
quelle
Mit coreutils csplit: csplit -z filesample '/^"/' {*}um mehr als einmal zu teilen und das erste Stück ( xx00) zu ignorieren, das immer leer ist (für das angegebene Textbeispiel).
don_crissti
3

Mit GNU awk

awk -v RS='"[[:space:]]*"' '
{sub(/^"|"[[:space:]]*$/, "");print > "output." ++n; close("output." n)}' file.txt
iruvar
quelle
Eine Alternative:awk -v RS='"' '!/^[[:space:]]*$/ {print > "output." n++; close...}'
Muru
2

Du kannst tun:

awk -v RS=\" -v ORS= \
  '{ sub(/^\n*/,"");sub(/\n*$/,""); };
  /^\n*$/ { next;};
  { if(strcnt==0) { print $0 >"file1"; strcnt++;} else
  { print $0 >"file2"; }; }' file
Hauke ​​Laging
quelle