#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, не зная, чего хочет ОП.