Замените пустые строки на ,
, затем удалите символы новой строки:
cat <file> | sed 's/^$/, /' | tr -d '\n'
Подойдет следующий awk:
awk 'BEGIN{RS = "";ORS = ",";FS = "\n";OFS = ""}($1=$1)' file
Это добавляет дополнительный ,
в конце. Избавиться от этого можно следующим образом:
awk 'BEGIN{RS = "";ORS = ",";FS = "\n";OFS = ""}
{$1=$1;s=s $0 ORS}END{sub(ORS"$","",s); print s}' file
Но то, что произошло сейчас, сделав эту небольшую модификацию, чтобы удалить последний ORS
(то есть запятую), вы должны сохранить все в памяти. Таким образом, вы могли бы просто сделать это более скучным и менее элегантным, сохранив полный файл в памяти:
awk '{s=s $0}END{gsub(/\n\n/,",",s);gsub(/\n/,"",s); print s}' file
Следующий sed делает то же самое. Сохраните полный файл в памяти и обработайте его.
sed ':a;N;$!ba;s/\n\n/,/g;s/\n//g' <file>
Однако есть способ немного поумнее с awk.
awk 'BEGIN{RS=OFS = "";FS = "\n"}{$1=$1; print (NR>1?",":"")$0}' file
Сценарий awk добавляет запятую ,
после последнего числа.
@oliv, да, это так.
Что, если бы в файле были строки. Мне нравится пример awk, но он предполагает числа
@RF вам нужно будет уточнить. Обновите свой вопрос, чтобы показать больше информации. Добавьте минимальный воспроизводимый пример, то есть представимый ввод, ожидаемый результат и, что более важно, то, что вы пытались сделать сами. Я спрашиваю вас об этом, поскольку в настоящее время я не знаю, что вы имеете в виду в своем комментарии, поскольку он неясен.
Это зависит от того, что вам нужно делать с этими данными.
С Perl у вас есть однострочный:
$ perl -00 -lnE 'say "element $. = $_"' file.txt
element 1 = a
element 2 = b
c
element 3 = d
Но очевидно, что вам нужно каким-то образом обработать элементы, и я подозреваю, что Perl - не ваша чашка чая.
С помощью bash вы могли:
elements=()
n=0
while IFS= read -r line; do
[[ $line ]] && elements[n]+ = "$line"$'\n' || ((n++))
done < file.txt
# strip the trailing newline from each element
elements=("${elements[@]/%$'\n'/}")
# and show what's in the array
declare -p elements
declare -a elements='([0] = "a" [1] = "b
c" [2] = "d")'
$ awk -v RS= '{print "Element " NR " = " $0}' file
Element 1 = a
Element 2 = b
c
Element 3 = d
Если вы действительно хотите сказать First Element
вместо Element 1
, тогда наслаждайтесь упражнением :-).
Добро пожаловать в Stack Overflow! Просто для справок в будущем. Извините, StackOverflow работает не так. Вопросы вида «Я хочу сделать X, дайте мне советы и / или пример кода» считаются не по теме. Посетите центр помощи и прочтите Как спросить, и особенно прочтите Почему "Кто-нибудь может мне помочь?" не актуальный вопрос?