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

时间:2018-01-07 16:29:43

标签: bash awk

我试图将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 
awk -F 'string2_to_search' '{$array2[count2++] = $2}' $READ_FILE 
#count++ indicates post increment of count variable

#do something with the array
.
.
#end

任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

大致是这样的东西呢?

awk '/string1_to_search/ {
        count["id1"]++; sum["id1"] += $2 }
    /string2_too/ {
        count["id2"]++; sum["id2"] += $2 }
    # ...
    END { for (k in count) printf("%s: sum %f/count %i = avg %f\n", k, sum[k], count[k], sum[k]/count[k]) }' inputfile

我似乎记得有一种聪明的方法来计算滚动方差而不将整个输入集保存在内存中;或者只是收集以空格分隔的值value["id"] = value["id"] " " $2并将其拆分为一个列表并在其末尾循环。或者,将其简化为一次只检查一个搜索字符串并多次运行(让我们希望输入不是很大)。或者切换到Perl,这将很容易让你收集列表和其他嵌套结构的列表。

显然将常用功能分解为单独的功能,因此您不会重复代码......我认为它实际上更清晰,但如果您发现错误或需要其他更改,您只需要必须在代码中更改一个位置。

答案 1 :(得分:0)

另一种方法是使awk打印出可以传递给bash中的数组变量的数字,如下所示:

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

后来为了取出均值,方差和SD,我们可以在bash中使用bc工具