Как инициализировать массив с помощью 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 

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

  • run bash не работает команда alias в zsh
  • Найти последний файл по расширению
  • Сколько пользователей поддерживает поддержку Linux в одно и то же время через SSH?
  • как отключить ожидание «нажмите enter» после выполнения сценария bash над cron
  • IFS null - это не то же самое, что unset IFS?
  • Я использую bash после этого испытания?
  • Как получить доступ к fpath пользователя, в отличие от fpath системы со сценарием?
  • Как запустить sh из файла sh
  • Возможно ли «защитить» символ IFS от разделения поля?
  • Как знак двоеточия и знак вопроса доллара объединяются в sh?
  • Сценарий оболочки для чтения вывода команды
  • Interesting Posts

    Как исключить некоторые команды из хранилища в истории TCSH?

    Диск по-прежнему заполнен после удаления некоторых файлов

    Разделение большого дерева каталогов по типу файла

    Название «уведомлено» ресурсом из «уведомленного» ресурса в кукольном

    как сфокусировать различные «регионы» (Ctrl-a S) с помощью мыши в `screen`?

    Подавить сообщение сервера в rsync

    Различия ч / б аппаратного времени и системного времени

    Как подключиться к файлу Windows?

    Изменить привязку порта с 127.0.0.1 до 0.0.0.0 на Oracle Linux 6 (RHEL 6)

    Замените строку в строке новой строкой (\ n) в Bash

    Есть ли инструмент, который позволяет мне преувеличивать уровни звука?

    Могу ли я создать символическую ссылку на файл, к которому я не могу получить доступ?

    openldap: добавить вспомогательный класс

    Плагин Xfce4 WaveLAN не работает – проблема с разрешением?

    pacman / yaourt / Arch Linux: как получить краткое изложение CLI устаревших пакетов

    Linux и Unix - лучшая ОС в мире.