Как получить текстовый файл в массив. Используя awk, каждый элемент отдельно в пустой строке

#arrays #bash #awk

Вопрос:

У меня есть файл, содержащий много строк. Мне нужно собрать эти строки в массив. Каждый элемент массива разделен пустой строкой, это означает, что каждый элемент массива может содержать более одной строки текста. Есть ли какое-либо решение с использованием Awk?

Я попробовал эти:

 myarr=($(awk -v RS= '{gsub(",n",",")}1' compare1))
 

Проблема в том, что каждый элемент разделен на новой строке, а не на пустой строке.

Как достичь этих решений с помощью Awk? Если в Bash есть другое решение, оно также будет приветствоваться.

Комментарии:

1. если вы не возражаете против использования perl, следование однострочному- perl -00p -F'n' -e '$_="@Fn"' <<< $'anbncnndnenf' это начало

2. Можете ли вы привести пример файла, который вы хотите обработать?

Ответ №1:

если мы можем предположить, что в файле нет символа NUL, мы можем заменить пустые строки на «», а затем использовать чтение для заполнения массива

 readarray -t -d '' my_arr < <(  perl -00l0pe 1 compare1 )
 

и чтобы проверить

 typeset -p my_arr
 

ПРАВКА: Я только что понял, что

 perl -00l0pe 1 compare1
 

также может быть написано с помощью awk

 awk -v RS= -v ORS='' 1  compare1
 

Комментарии:

1. readarray -t -d '' my_arr < <(perl -00l0pe 1 compare1) избегает петли.

2. @Shawn, это правда, обновлено, однако оно все еще неэффективно из-за чтения баша, было бы лучше работать с perl, не зная, чего хочет ОП.