Как объединить первые n строк в файле - PullRequest
8 голосов
/ 12 марта 2009

Я пытаюсь очистить некоторые данные, и в итоге я бы хотел перевести их в форму CSV.

Я использовал некоторые регулярные выражения, чтобы очистить его, но я застрял на одном шаге.

Я хотел бы заменить все, кроме каждого третьего символа новой строки (\ n) запятой.

Данные выглядят так:

field1
field2
field3
field1
field2
field3

и т.д ..

Мне нужно это в

field1,field2,field3
field1,field2,field3

У кого-нибудь есть простой способ сделать это, используя sed или awk? Я мог бы написать программу и использовать цикл со счетчиком модов для удаления каждого 1-го и 2-го символа новой строки, но я бы предпочел сделать это из командной строки, если это возможно.

Ответы [ 8 ]

7 голосов
/ 12 марта 2009

с awk:

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

Этот скрипт сохраняет последние три строки и печатает их на каждой третьей строке. К сожалению, это работает только с файлами, кратными 3 строкам.

Более общий сценарий:

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

В этом случае последние три строки объединяются в одну строку с разделителем-запятой, вставляемым всякий раз, когда номер строки не кратен 3. В конце файла строка печатается, если она не пуста с удаленной запятой.

5 голосов
/ 13 марта 2009

Awk версия:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}'
4 голосов
/ 13 марта 2009

Решение Perl, которое немного короче и которое обрабатывает файлы, которые не содержат кратные 3 строки:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt
1 голос
/ 24 февраля 2012

Это может работать для вас:

paste -sd',,\n' file

или это:

sed '$!N;$!N;y/\n/,/' file
1 голос
/ 13 марта 2009

Использование nawk или / usr / xpg4 / bin / awk on Solaris :

awk 'ORS=NR%3?OFS:RS' OFS=, infile
1 голос
/ 13 марта 2009

кошачий файл | perl -ne 'chomp (); печатать $ _,! (++ $ i% 3)? "\ n": ","; '

0 голосов
/ 02 апреля 2009

awk '{ORS = NR% 3? ",": "\ N"; печать}' urdata.txt

0 голосов
/ 13 марта 2009

версия vim:

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