2016-08-03 21 views
0

Ich habe eine große CSV-Datei, die Absätze wie folgt enthält:bash finden und „Enter“ mit Komma vor bestimmten Muster ersetzen

first line1 
second line1 
third line1 
fourth line1 
first line2 
second line2 
third line2 
fourth line2 

Nach der Bearbeitung würde ich in diese übersetzt werden mag:

first line1,second line1,third line1,fourth line1 
first line2,second line2,third line2,fourth line2 

Hinweis: erste Zeile, zweite Zeile usw. enthält Sonderzeichen wie. , Ich denke, dass eine Option sein könnte, "zweites" Wort aus zweiter Zeile1 zu finden und das "enter" davor durch ein Komma zu ersetzen. Auf diese Weise wird die zweite Zeile1 auf der rechten Seite des .? ersten line1

Wie kann ich dies tun

der Tat ist es durchaus möglich, dass obige Beispiel nicht die reale iST-Daten vorhanden sind, hier ist es:

137822118,user,User,192.168.100.20,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ABCD_BD,Succeeded,"NE Name:B12345-BXL_ABCD_BD 
MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.20""; 
MML Result:Successful. 
",2016-07-25 23:19:05 DST 
137821234,user,User,192.168.100.21,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ASDF_BD,Succeeded,"NE Name:B12345-BXL_ASDF_BD 
MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.21""; 
MML Result:Successful. 
",2016-07-25 22:18:05 DST 

Die CSV-Datei eine Menge enthält Diese Art von Absätzen.

Die Ausgabe sollte (ein Absatz in einer Zeile) sein:

137822118,user,User,192.168.100.20,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ABCD_BD,Succeeded,"NE Name:B12345-BXL_ABCD_BD,MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.20""; MML Result:Successful. ",2016-07-25 23:19:05 DST  
137821234,user,User,192.168.100.21,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ASDF_BD,Succeeded,"NE Name:B12345-BXL_ASDF_BD,MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.21""; MML Result:Successful. ",2016-07-25 22:18:05 DST 

Vielen Dank für Ihre Hilfe!

Ich habe versucht Ihre Lösungen und es funktioniert fast, aber ist nicht das erwartete Ergebnis. Es scheint, dass das Beispiel, das ich Ihnen gebe, sich geringfügig von der Quelldatei unterscheidet, wegen des Buchungsformats hier.

Hier finden Sie die reale Quelle CSV-Datei (nur ein paar Zeilen wie die komplette Datei mehr als eine Million enthält)

https://www.wetransfer.com/downloads/637b36b2148550ad090c22c9e8297a9c20160804081835/48b90b

Sorry für die Missverständnisse und wieder danken!

+0

Gibt es immer 4 Zeilen zu einem Set? Bitte zeigen Sie die tatsächlichen Daten an, damit wir die Platzierung von Sonderzeichen usw. sehen können. –

+0

Dies ist ein Duplikat von http://stackoverflow.com/q/38731863/1745001, aber ich kann es nicht als dup schließen, da die Antwort dort nicht vorhanden ist wurde noch nicht abgestimmt oder akzeptiert. –

Antwort

0

versuchen Sie dies;

awk -v patt="first" 'BEGIN{ORS=","}$0 ~ patt {gsub(patt, "\n"patt)}1' CSVfile 
+0

Es hinterlässt Kommas. –

1

Sie paste dafür verwenden können, zum Beispiel:

$ paste -d, - - - - < file 
first line1,second line1,third line1,fourth line1 
first line2,second line2,third line2,fourth line2 

- bedeutet Standardeingabe, wenn Sie N von ihnen (N = 4 in diesem Beispiel) angeben, paste wird eine Linie bilden von N Zeilen von der Standardeingabe.

-d ist der Spaltentrenner anzugeben, in diesem Beispiel ein Komma.

0
$ awk 'NR==1 {prev=$0; next} {printf "%s", prev; printf "%s", $0~/^[0-9]{9}/ ?"\n":","; prev=$0} END{print prev}' test.in 
137822118,user,User,192.168.100.20,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ABCD_BD,Succeeded,"NE Name:B12345-BXL_ABCD_BD ,MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.20""; ,MML Result:Successful. ,",2016-07-25 23:19:05 DST 
137821234,user,User,192.168.100.21,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ASDF_BD,Succeeded,"NE Name:B12345-BXL_ASDF_BD ,MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.21""; ,MML Result:Successful. ,",2016-07-25 22:18:05 DST 

Wenn ein neuer Datensatz mit einer Reihe von Zahlen beginnt, ist es Zeit für Newline. Das nächste Mal, bitte posten Sie die richtigen Daten gleich am Anfang.

3

eine weitere alternative

$ awk '{ORS=NR%4?",":RS}1' file 

zurückgesetzt alle vier Zeilen und Drucken der Ausgabeaufzeichnung Separators.

0

Mit GNU awk für FPAT und macht keine Annahmen darüber, wie viele Zeilen oder Felder Ihre Eingabe hat oder welche Feldwerte treten am Anfang/Ende der Datensätze:

$ cat decsv.awk 
BEGIN { FPAT = "([^,]*)|(\"[^\"]+\")"; OFS="," } 
{ 
    # create strings that cannot exist in the input to map escaped quotes to 
    gsub(/a/,"aA") 
    gsub(/\\"/,"aB") 
    gsub(/""/,"aC") 

    # prepend previous incomplete record segment if any 
    $0 = prev $0 
    numq = gsub(/"/,"&") 
    if (numq % 2) { 
     # this is inside double quotes so incomplete record 
     prev = $0 OFS 
     #prev = $0 RT # uncomment to retain newlines in the record 
     next 
    } 
    prev = "" 

    for (i=1;i<=NF;i++) { 
     # map the replacement strings back to their original values 
     gsub(/aC/,"\"\"",$i) 
     gsub(/aB/,"\\\"",$i) 
     gsub(/aA/,"a",$i) 
    } 

    print 

    #printf "Record %d:\n", ++recNr 
    #for (i=0;i<=NF;i++) { 
     #printf "\t$%d=<%s>\n", i, $i 
    #} 
    #print "#######" 
} 

.

$ awk -f decsv.awk file 
137822118,user,User,192.168.100.20,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ABCD_BD,Succeeded,"NE Name:B12345-BXL_ABCD_BD ,MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.20""; ,MML Result:Successful. ,",2016-07-25 23:19:05 DST 
137821234,user,User,192.168.100.21,2016-07-25 23:19:05 DST,iScript,iScript send MML command,B12345-BXL_ASDF_BD,Succeeded,"NE Name:B12345-BXL_ASDF_BD ,MML Command:LST DEVIP:OPONEMS=""user"", IPOFEMSWS=""192.168.100.21""; ,MML Result:Successful. ,",2016-07-25 22:18:05 DST 

Weitere Informationen finden Sie unter Awk to get .csv column containing commas and newlines.