2009-03-12 16 views
8

Ich versuche, einige Daten zu bereinigen, und ich würde es schließlich gerne in CSV-Form setzen.Wie man die ersten n Zeilen in einer Datei verbindet

Ich habe einige reguläre Ausdrücke verwendet, um es aufzuräumen, aber ich bin auf einem Schritt fest.

Ich möchte alle außer jedem dritten newline (\ n) durch ein Komma ersetzen.

Die Daten sieht wie folgt aus:

field1 
field2 
field3 
field1 
field2 
field3 

etc ..

Ich brauche es in

field1,field2,field3 
field1,field2,field3 

Wer eine einfache Art und Weise haben diese mit sed oder awk zu tun? Ich könnte ein Programm schreiben und eine Schleife mit einem Mod-Zähler verwenden, um jedes erste und zweite Zeilenumbruchzeichen zu löschen, aber ich würde es lieber von der Kommandozeile aus machen, wenn es möglich ist.

Antwort

7

Mit awk:

awk '{n2=n1;n1=n;n=$0;if(NR%3==0){printf"%s,%s,%s\n",n2,n1,n}}' yourData.txt 

Dieses Skript speichert die letzten drei Zeilen und sie bei jeder dritten Zeile drucken. Leider funktioniert das nur mit Dateien, die ein Vielfaches von 3 Zeilen haben.

Ein allgemeinerer Skript ist:

awk '{l=l$0;if(NR%3==0){print l;l=""}else{l=l","}}END{if(l!=""){print substr(l,1,length(l)-1)}}' yourData.txt 

In diesem Fall werden die letzten drei Zeilen sind in einer einzelnen Zeichenfolge verkettet mit dem Kommaseparator eingefügt, wenn die Zeilennummer nicht ein Vielfaches von 3. Bei dem IS Ende der Datei wird die Zeichenfolge gedruckt, wenn sie nicht leer ist und das abschließende Komma entfernt wurde.

1

Katzendatei | perl -ne 'chomp(); Drucken $ _,! (++ $ i% 3)? "\ n": ","; '

5

Awk Version:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}' 
4

Ein Perl-Lösung, die etwas kürzer ist und dass die Dateien handhaben, die nicht ein Vielfaches von 3 Zeilen haben:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt 
+0

der war gut auf den nicht-mulitple-of-three-Dateien. Ich wusste, dass es mir nicht gelungen ist, aber ich habe die Lösung in 3 Minuten nicht gesehen. – jj33

0

vim Version:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g 
1

Verwenden Sie nawk oder /usr/xpg4/bin/awk auf Solaris:

awk 'ORS=NR%3?OFS:RS' OFS=, infile 
0

awk '{ORS = NR% 3 " ":" \ n"; print}' urdata.txt

1

Dies könnte für Sie arbeiten:

paste -sd',,\n' file 

oder dies:

sed '$!N;$!N;y/\n/,/' file 
Verwandte Themen