【问题标题】:awk store a pattern result to a shell array variableawk 将模式结果存储到 shell 数组变量
【发布时间】:2018-06-16 18:39:39
【问题描述】:

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

任何建议都会有所帮助。

【问题讨论】:

  • Awk 并不能真正访问 shell 的变量,反之亦然。您能否重构您的问题以在 awk 脚本中完成所有处理?或者相反,让 Awk 处理一次文件并以 shell 可以直接解析的形式打印结果。但我在想,如果您的要求不平凡,也许正确的解决方案是切换到 Python 等现代脚本语言。
  • 不,我不能在 python 中做到这一点。我可以重构我的问题,但我需要在 bash 中进行。问题是我不是 bash 专家
  • 你能概括一下这个脚本更广泛的用途吗?它是否要求这些数组是 Bash 数组?一个 Awk 脚本可能是重构它的最简单的方法,但是如果您需要 Awk 中不可用的功能,这会使事情变得复杂(尽管您也可以从 Awk 调用外部命令)。
  • 你在用bash在超级计算机上做数据分析?
  • 你刚才说的是bash cannot handle floating point numbers,然后是it can be done in bash。 bc 和 gawk 都不是 bash。每个人都在告诉您您需要使用 bash 以外的工具,并且您在争辩说您可以/必须使用 bash,同时告诉我们您已经在使用 bash 以外的工具。没有人建议您不能从 bash 调用外部工具,但是您坚持 i need to do it in bash 让我们感到困惑。只需在 awk 中完成。

标签: bash awk


【解决方案1】:

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

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

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

【讨论】:

  • 这里可能存在一些不明显的外部因素,这使得bc 成为一个不错的选择,但是根据您在这里告诉我们的内容,我认为使用 Awk 脚本来收集已达成共识值并执行这些计算似乎是一种更好的方法。
【解决方案2】:

大概是这样吧?

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,它可以让您轻松收集列表列表和其他嵌套结构。

显然将通用功能分解为单独的功能,这样您就不会重复代码...我想这样实际上更清晰,但是如果您发现错误或需要其他更改,则只需更改一个地方在代码中。

【讨论】:

  • 谢谢.. 似乎非常接近我想要得到的。如果我能够让这个工作,我会告诉你:)
  • 显然将通用功能分解为单独的功能,这样您就不会重复代码......我的意思是在答案中提到这一点,但我想它实际上更清晰。
  • 我用其他方法做到了,但这也有效。
  • 我也从不厌倦将人们推荐给this。 :)
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2022-10-19
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多