Bash awk将模式结果存储到shell数组变量
我试图将awk匹配的模式结果存储到shell数组变量。下面是一个简化的例子:Bash awk将模式结果存储到shell数组变量,bash,awk,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 belo
#!/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
任何建议都会有帮助。那么大概是这样的吧
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,它可以让您轻松地收集列表列表和其他嵌套结构的列表
显然,将常见功能分解为单独的功能,这样您就不会有重复的代码。。。我想这样更清楚,但如果发现bug或需要其他更改,只需更改代码中的一个位置。另一种方法是让awk打印可以传递给bash中数组变量的数字,如下所示:
mapfile -t array1 < <( awk -F 'string1_to_search' '{print $2}' "$READ_FILE" )
mapfile-tarray1bash
在超级计算机上进行数据分析?您刚才说bash无法处理浮点数
,然后可以在bash
中完成。bc和gawk都不是bash。每个人都在告诉你需要使用bash以外的工具,你在说你已经在使用bash以外的工具,而你却在说你可以/必须使用bash。没有人建议您不能从bash调用外部工具,但您坚持认为我需要在bash中调用它,这让我们感到困惑。请用awk来完成这一切。谢谢。。看起来很接近我想要的。我会让你知道,如果我能让这个工作:)显然,打破常见的功能到单独的功能,所以你没有重复的代码。。。我想在回答中提到这一点,但我想这实际上更清楚。我使用了其他方法,但这也很有效。我也从不厌倦将人们引向我。:)这里可能有一些不明显的外部因素使得bc
成为一个不错的选择,但是根据您在这里告诉我们的,我认为大家一致认为使用Awk脚本收集值并执行这些计算似乎是一种更好的方法。