Bash: разделение файла пустыми строками и присвоение списку - PullRequest
0 голосов
/ 13 сентября 2018

Итак, у меня есть файл, например

a

b
c

d

Из этого я хотел бы составить список строк с данными. Пустая строка будет разделителем. Таким образом, приведенный выше список файлов будет

First element = a 
Second element = b
c
Third element = d

Ответы [ 4 ]

0 голосов
/ 14 сентября 2018
$ awk -v RS= '{print "Element " NR " = " $0}' file
Element 1 = a
Element 2 = b
c
Element 3 = d

Если вы действительно хотите сказать First Element вместо Element 1, тогда наслаждайтесь упражнением: -).

0 голосов
/ 13 сентября 2018

Подойдет следующий 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
0 голосов
/ 13 сентября 2018

Это зависит от того, что вам нужно делать с этими данными.

С 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")'
0 голосов
/ 13 сентября 2018

Замените пустые строки на ,, затем удалите символы новой строки:

cat <file> | sed 's/^$/, /' | tr -d '\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...