2016-07-20 11 views
0

Ich möchte Zeilen teilen/duplizieren (teilen Sie einen Teil, und kopieren Sie den Rest), ganz wie umgekehrt group_concat in MySQL.Split/doppelte Zeile, wie eine umgekehrte group_concat

Eingang ist wie folgt (es gibt über 1 M Zeilen gesamt):

2016-07-18 08:55:09,www.rozklad-pkp.pl,0.575,160x600;120x600,standard 
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,320x50;468x60;320x100;750x200;300x75,mobile 
2016-07-18 08:55:09,wpolityce.pl,0.87,300x75;300x250;320x100;300x50;320x50,mobile 

Zum Beispiel aus der 2. Linie I erhalten möchten:

2016-07-18 08:55:09,rozklad-pkp.pl,0.575,320x50,mobile 
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,468x60,mobile 
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,320x100,mobile 
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,750x200,mobile 
2016-07-18 08:55:09,rozklad-pkp.pl,0.575,300x75,mobile 

Ich weiß nicht, wie man dorthin , insbesondere wenn die Anzahl der Zeilen, die ich in einer Zeile aufteilen möchte, unterschiedlich ist.

Das Konzept ist zu abstrakt für mich, ich weiß nicht, wie man es richtig "erfasst".

Ich dachte über "mapping" Zeilen, in zwei separate Teile (linker Teil, zu teilender Teil und rechter Teil), grep'ing die Anzahl der Semikolons, teilen und kopieren sie wieder zusammen; aber es ist ziemlich kompliziert für mich, und ich denke, dass es andere, einfachere Weise geben muss.

Ich kann grep, sed, awk, Perl usw. (bash im Allgemeinen) oder SQLite verwenden.

+0

Für alle Linien, in denen viele Größen aufgeführt sind (durch Semikolon getrennt). edit: so, Beispiel Zeile 1 aufgeteilt in 2; Linie 2 in 5 (wie gezeigt), und Linie 3 in 5 usw. – JMKS

+0

Ich möchte nichts entfernen, nur split/duplizieren, wenn es viele Größen gibt (das sind Größen von Werbebannern in der Tat). Einige Zeilen enthalten keine Semikolons, in diesem Fall gibt es gute, wie sie jetzt sind. Zeilen, die Semikolons enthalten, müssen in so viele neue Zeilen aufgeteilt werden (Duplizieren von links und rechts; und Schneiden dieser Werte zwischen 1 pro Zeile), wie es Werte gibt. – JMKS

Antwort

2

können Sie versuchen, die folgenden awk Skript:

awk -F, -v OFS="," '{split($4,a,";"); for(i in a) {$4=a[i];print}}' file 

, die die Linien auf den Inhalt des vierten Feld jeder Zeile basiert sein wird, duplizieren.

+0

^für eine ausgezeichnete Lösung! – Inian

+0

Selbe in Perl 'Perl -F, -ane 'für (Split /; /, $ F [3]) {$ F [3] = $ _; Druck Join (", ", @ F)}' Datei ' – 123

+1

Beide haben funktioniert, vielen Dank :). – JMKS