Как инициализировать массив с помощью awk и bash?

Я пытаюсь сохранить значения первой строки текстового файла в массиве. Вот что я имею до сих пор:

arr_values=() awk ' NR==1 { for (i=0; i<=NF; i++) 'arr_values[i]'=$i #error here }' file.txt for ((i=0; i<${#arr_values[@]}; i++)) do echo ${arr_values[i]} done 

Я получаю сообщение об ошибке с инициализацией массива в основном потому, что я не знаю, как использовать awk для инициализации внешнего массива. Любые предложения (только с awk )? Благодарю.

Извинись за перекрестный пост, я не получил ответа, который хотел.

4 Solutions collect form web for “Как инициализировать массив с помощью awk и bash?”

Вы можете получить более качественные ответы, если вы объясните, почему awk … и как выглядит первая строка данных.

Поскольку вы не изменили разделитель полей, я предполагаю, что вы обрабатываете строку элементов, разделенных пробелами. Следующее сделает именно то, что вы ищете:

 arr_values=() read -ra arr_values <<< $(head -n 1 file.txt) for s in "${arr_values[@]}"; do echo "$s" done 

Вся работа выполняется в команде read . Если вам не нужно обрабатывать значения в массиве несколько раз; то вы могли бы просто сделать:

 set -f # disable globbing, in case the lines contain wildcard characters for s in $(head -n 1 file.txt); do set +f echo "$s" done set +f 

Это поместит каждую непустую запись поля, которая разделяется пробелами в $s и пропустит один проход через цикл.

Вы не можете сделать это именно так. Вы должны выполнить команду awk, создав серию выходных значений, ограниченных некоторым разделителем (пробел, табуляция, NUL или что-то еще), затем назначьте их элементам массива. Причина этого заключается в том, что awk – это программа, которая запускается оболочкой, и она выполняется до завершения, прежде чем все операции оболочки будут выполняться. Вы не можете вставлять материал оболочки в свой материал awk, как это.

Вы можете сделать что-то вроде приведенного ниже, чтобы использовать ваш простой пример, но я не уверен, что код awk, который вы предоставили, будет делать то, что вы хотите в любом случае. Если файл имеет нулевые записи или более одной записи, вывод (и, следовательно, массив оболочки) будет содержать строки файла. Похоже, вы хотите, чтобы выходной массив содержал набор целых чисел от нуля до количества полей, которые вы находите в файле if-and-only, если он содержит только одну запись. Если вы хотите избежать появления больших массивов в массиве, вам нужно будет добавить второе действие без шаблонов в awk-коде, содержащем только «{}» в качестве действия, как я сделал ниже. Кроме того, отключите расширение подстановочного имени файла ( set -f ), если строка содержит подстановочные знаки \[*? ,

 set -f arr_values=(`awk ' NR==1 { for (i=0; i<=NF; i++) print $i } { }' file.txt`) set +f for ((i=0; i<${#arr_values[@]}; i++)) do echo "${arr_values[i]}" done 

Если вы хотите использовать awk , вы можете сделать следующее:

 arr_values=( $(awk '{print;exit}' file) ) 

Оболочка будет выполнять разделение по пробелам. Обратите внимание, что если строка содержит подстановочные знаки, они будут расширены до списка соответствующих файлов (если они есть). Используйте set -f чтобы отключить расширение подстановочных знаков.

 set -f arr_values=( $(awk '{print;exit}' file) ) set +f 

Я не знаю о других вещах, но если вы разделяете пробел, это будет хранить первую строку текстового файла в массиве оболочки, разделенную на пробел:

 set -f ; set -- $(head -n1 <textfile) ; set +f 

Это все, что нужно. Теперь ваши позиционные параметры – это различные индексы массивов, а ваш массив – "$@" .

  • Запустите команду Vim из сценария bash
  • Каким образом можно фильтровать текстовый файл для удаления пустых строк?
  • нужна портативная crontab-проверка хоста / отказоустойчивая логика в Linux и Cygwin
  • error = $ (mkdir test 2> & 1) В чем смысл этого выражения?
  • Как печатать одинаковые строки несколько раз с переменными, измененными с помощью Sed / Awk / anything?
  • Почему звездочка в команде приводит к расширению цикла?
  • Как я могу буферизировать канал с минимальной добавленной задержкой?
  • очистить tmpfs в моем случае
  • ImageMagick для нескольких файлов
  • Почему моя «дата» не может обрабатывать временные интервалы?
  • Трубопроводы для выхода цикла предотвращают изменение локальной переменной
  • Вход в систему с конкретной оболочкой при входе в терминал
  • Linux и Unix - лучшая ОС в мире.