如何使用 awk 和 bash 初始化陣列?

如何使用 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)?謝謝。

對於交叉帖子表示歉意,我沒有得到我想要的答案。

答案1

如果您解釋了上下文,您可能會得到更好的答案為什麼 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並使其通過循環。

答案2

你不能完全按照這種方式去做。您必須讓 awk 指令執行,建立一系列由某些分隔符號(空格、製表符、NUL 等)分隔的輸出值,然後將它們指派給陣列元素。原因是 awk 是一個由 shell 運行的程序,它先運行完成任何執行更多 shell 操作。你不能像這樣將 shell 內容嵌入到 awk 內容中。

您可以執行以下操作來使用您的簡單範例,但我不確定您提供的 awk 程式碼在任何情況下都能滿足您的要求。如果檔案有零個記錄或多於一個記錄,則輸出(以及 shell 陣列)將包含該檔案的行。看起來您希望輸出數組包含一組從零到您在文件中找到的字段數的整數,當且僅當它僅包含一個記錄時。如果您希望避免數組中出現較大的文件,則必須在 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

答案3

如果你想使用awk,你可以這樣做:

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

shell 將根據空白分割。請注意,如果該行包含通配符,它​​們將擴展到匹配文件的清單(如果有)。用於set -f禁用通配符擴充。

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

答案4

我不知道其他的東西,但如果你在空格上分割,這會將文字檔案的第一行儲存在按空格分割的 shell 數組中:

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

僅此而已。現在您的位置參數是各種數組索引,您的數組是"$@"

相關內容