我正在尝试将 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