2009-03-12 13 views
8

Próbuję wyczyścić niektóre dane, a ostatecznie chciałbym umieścić je w formularzu CSV.Jak dołączyć do pierwszych n wierszy w pliku

Użyłem niektórych wyrażeń regularnych, aby je wyczyścić, ale utknąłem na jednym kroku.

Chciałbym zastąpić wszystkie, ale co trzeci znak nowej linii (\ n) przecinkiem.

Dane wygląda następująco:

field1 
field2 
field3 
field1 
field2 
field3 

etc ..

muszę go

field1,field2,field3 
field1,field2,field3 

ktoś ma prosty sposób to zrobić przy użyciu sed lub awk? Mógłbym napisać program i użyć pętli z licznikiem modów do kasowania każdego pierwszego i drugiego znaku nowej linii, ale wolałbym zrobić to z linii poleceń, jeśli to możliwe.

Odpowiedz

7

Z awk:

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

Ten skrypt zapisuje ostatnie trzy linie i wydrukować je na każdym trzeciej linii. Niestety działa to tylko z plikami o wielokrotności 3 linii.

Bardziej ogólny scenariusz jest:

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 

W tym przypadku ostatnie trzy linie są łączone w jeden ciąg, z separatorem przecinkami włożony, gdy liczba linii jest wielokrotnością 3. Na koniec pliku, napis jest drukowany, jeśli nie jest pusty z usuniętym przecinkiem.

1

plik cat | perl -ne 'chomp(); wydrukować $ _,! (++ $ i% 3)? "\ n": ","; ' Wersja

5

awk:

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

Perl, że jest trochę krótszy i który obsługuje pliki, które nie mają wielokrotność 3 linie: Wersja

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

Good one na non-mulitple-of-trzy pliki. Wiedziałem, że mój nie poradził sobie z tym problemem, ale nie widziałem rozwiązania w ciągu 3 minut. – jj33

0

vim:

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

Użyj nawk lub /usr/xpg4/bin/awk na Solaris:

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

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

1

To może pracować dla Ciebie:

paste -sd',,\n' file 

lub to:

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