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.


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 #.


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.