2013-10-01 5 views

ответ

2

для примера на ваш вопрос, это один лайнер работает:

awk -v RS= '/----/{next}{gsub(/\n/,",")}7' file 

или путем установки OFS and FS:

awk -v RS= -v OFS="," -F'\n' '/----/{next}$1=$1' file 

маленький тест:

kent$ awk -v RS= '/----/{next}{gsub(/\n/,",")}7' f 
cat,dog,mouse 
lion,tiger,zebra 



kent$ awk -v RS= -v OFS="," -F'\n' '/----/{next}$1=$1' f 
cat,dog,mouse 
lion,tiger,zebra 
+0

Что значение из '7'? Это просто истинное значение, так что записи печатаются? –

+0

@JonathanLeffler да. отличное от нуля. – Kent

+1

Я знаю, что это работает; это отлично подходит для Code Golf; лично, я не думаю, что случайная константа имеет место в производственном коде. Я бы предпочел видеть '{print}', который является явным. Хотя '1' также выполняет эту работу и является полупринятой, мне не нравится (полу) соглашение. Наверное, сегодня утром я встал с постели с другой стороны. –

2

Один из способов с awk:

$ awk '!(NR%2){$1=$1;print}' FS='\n' OFS=',' RS= file 
cat,dog,mouse 
lion,tiger,zebra 
0

Вы можете сделать это, используя режим абзаца в Perl:

$ perl -000 -ne 'next if /---/;print join(",",split(/\n/)),"\n"' file 
cat,dog,mouse 
lion,tiger,zebra 

От man perlrun:

-0[octal/hexadecimal] 
    specifies the input record separator ($/) as an octal or hexadecimal number. 
    If there are no digits, the null character is the separator. Other switches 
    may precede or follow the digits. For example, if you have a version of 
    find which can print filenames terminated by the null character, you can say 
    this: 

      find . -name '*.orig' -print0 | perl -n0e unlink 

    The special value 00 will cause Perl to slurp files in paragraph mode. 
    Any value 0400 or above will cause Perl to slurp files whole, but by 
    convention the value 0777 is the one normally used for this purpose. 
Смежные вопросы