мой входной файл:Как преобразовать столбцы в строки в unix?
zoo1
----
cat
dog
mouse
zoo2
----
lion
tiger
zebra
Я хочу, чтобы мой выходной файл будет:
cat,dog,mouse
lion,tiger,zebra
Любая идея, как?
мой входной файл:Как преобразовать столбцы в строки в unix?
zoo1
----
cat
dog
mouse
zoo2
----
lion
tiger
zebra
Я хочу, чтобы мой выходной файл будет:
cat,dog,mouse
lion,tiger,zebra
Любая идея, как?
для примера на ваш вопрос, это один лайнер работает:
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
Один из способов с awk
:
$ awk '!(NR%2){$1=$1;print}' FS='\n' OFS=',' RS= file
cat,dog,mouse
lion,tiger,zebra
Вы можете сделать это, используя режим абзаца в 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.
Что значение из '7'? Это просто истинное значение, так что записи печатаются? –
@JonathanLeffler да. отличное от нуля. – Kent
Я знаю, что это работает; это отлично подходит для Code Golf; лично, я не думаю, что случайная константа имеет место в производственном коде. Я бы предпочел видеть '{print}', который является явным. Хотя '1' также выполняет эту работу и является полупринятой, мне не нравится (полу) соглашение. Наверное, сегодня утром я встал с постели с другой стороны. –