awk 将模式结果存储到 shell 数组变量中

awk 将模式结果存储到 shell 数组变量中

我正在尝试将 awk 匹配的模式的结果存储到 shell 数组变量中。以下是相同的简化示例:

#!/bin/bash
declare -a array1=()
declare -a array2=()
READ_FILE="directory1/read_file.csv"
WRITE_FILE="directory2/results.csv"

#variable for counting array index
count1=0
count2=0
#
#
# need help with line below
# $2 below is the second set of characters which is a floating point number
awk -F 'string1_to_search' '{$array1[count1++] = $2}' $READ_FILE >> $WRITE_FILE
awk -F 'string2_to_search' '{$array2[count1++] = $2}' $READ_FILE >> $WRITE_FILE
#count++ indicates post increment of count variable

任何的意见都将会有帮助。

答案1

您不能从内部写入 Bash 变量awk

您应该做的是打印awk出您想要存储在数组中的所有内容,每行一个项目,然后使用 Bash 内置函数mapfile将其读入数组:

mapfile -t array1 < <( awk -F 'string1_to_search' '{print $2}' "$READ_FILE" )

此后,您的数组就在 中$array1。您也不需要declare事先这样做,mapfile它会为您完成。

mapfile输入 即可找到有关 的更多信息help mapfile

边注:
我在这里使用了重定向进程替换,mapfile ... < <( awk ... )而不是管道awk ... | mapfile ...,因为您不能将其用作mapfile管道的一部分。这是因为管道是在子 shell 中执行的,而子 shell 不会将其更改的变量传播回父 shell,即的值myarray将丢失。

答案2

例如当你想输出

awk -f TableParser.awk table.txt

要在 shell 脚本中读取为变量,只需写入以下内容:

#!/bin/sh

mapfile -t var1 < <( awk -f TableParser.awk table.txt )
echo $var1

相关内容