【问题标题】:Put result of awk into an array将 awk 的结果放入数组中
【发布时间】:2014-02-03 12:12:15
【问题描述】:

当我在终端上运行以下命令时,

awk /984/ $files | awk -F, '{OFS=",";print $1,$4,$17}'

在哪里,

files=`ls`

我得到这个输出:

2013/08/18 12:51:37,11,724
2013/08/18 12:48:02,227,84769

我希望创建一个脚本,运行该命令并以这种方式将上述结果分配给一个数组:(单独的行作为单独的元素)

array[0] = 2013/08/18 12:51:37,11,724
array[1] = 2013/08/18 12:48:02,227,84769

但是,

都不是,

result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'))

也不,

result2=`awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'`

实现了我的目的。

如何获取我指定的数组?

【问题讨论】:

  • 您应该使用像 awk '/string/' "$files" 这样的引号并将文件读取更改为 files=$(ls)。 result2 是错误的,因为它只计算命令,需要外部 () 存储在数组中。
  • $files 中添加引号可能会导致错误的结果,因此请忽略。

标签: bash shell scripting awk ksh


【解决方案1】:

当你说:

result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'))

输出将被空格分割。将IFS 设置为换行符,您应该会看到所需的结果。说:

IFS=$'\n' result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'))

而是将不同的输出捕获到一个数组中。

【讨论】:

    【解决方案2】:

    我认为问题在于您的脚本中 () 的使用。 我尝试了一个类似的例子并得到了所需的输出

    myarray=(`ls *.sh`)
    for f in ${myarray[@]} 
    do
        echo $f
    done
    

    我觉得你的代码应该改成如下

    result=(`awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'`)
    

    【讨论】:

    • 这与他已经发布的result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}')) 相同,您应该尽量避免使用旧的背部抽动。
    【解决方案3】:

    要将变量存储在数组中,输出需要采用如下形式:

    result=$(one two "more data")
    echo ${result[2]}
    more data
    

    数据以空格分隔。因此,请调整您的输出以提供该格式。

    你能举个例子说明你从中得到了什么吗:

    awk '/984/' $files | awk -F, '{OFS=",";print $1,$4,$17}'
    

    可以缩短为:

    awk -F, '/984/ {OFS=",";print $1,$4,$17}' $files
    

    【讨论】:

    • 缩短的命令在终端中运行良好,但是当我在脚本中执行 result=($(shortened_command)) 并回显结果时,它没有给出任何结果。
    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2020-07-25
    • 2018-12-03
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多