【问题标题】:AWK - Splitting a variable into an array with the index without loopingAWK - 将变量拆分为具有索引的数组而不循环
【发布时间】:2015-12-02 00:06:32
【问题描述】:

我在变量 ArtTEXT 中有这个(演示)文本。

1|Reporting Problems and Bugs. 
2|Other freely available awk implementations. 
5|Summary of installation. 
8|How to disable certain gawk extensions. 
3|Making Additions To gawk. 
7|Accessing the Git repository. 

它是一个变量,其中行用已知字符串分隔。

我想将它拆分为一个数组,其中行首的数字将是使用一个命令的数组行的索引,而不是循环遍历行。

结果应该是:

arr[1] => Reporting Problems and Bugs. 
arr[2] => Other freely available awk implementations. 
arr[5] => Summary of installation. 
arr[8] => How to disable certain gawk extensions. 
arr[3] => Making Additions To gawk. 
arr[7] => Accessing the Git repository. 

这可能吗?

【问题讨论】:

  • split string to array using awk 的可能重复项
  • 如果您告诉我们这个分隔行的“已知字符串”是什么,您不认为我们可以更轻松地为您提供帮助吗?

标签: arrays awk split


【解决方案1】:

不,这是不可能的。以下是如何根据需要从变量中填充数组(假设分隔行的“已知字符串”是换行符):

$ awk -v ArtTEXT='1|Reporting Problems and Bugs.
2|Other freely available awk implementations.
5|Summary of installation.
8|How to disable certain gawk extensions.
3|Making Additions To gawk.
7|Accessing the Git repository.' '
BEGIN {
    split(ArtTEXT,lines,/\n/)
    for (lineNr in lines) {
        split(lines[lineNr],flds,/\|/)
        arr[flds[1]] = flds[2]
    }

    for (i in arr) {
        printf "arr[%d] => %s\n", i, arr[i]
    }
}
'
arr[1] => Reporting Problems and Bugs.
arr[2] => Other freely available awk implementations.
arr[3] => Making Additions To gawk.
arr[5] => Summary of installation.
arr[7] => Accessing the Git repository.
arr[8] => How to disable certain gawk extensions.

【讨论】:

  • 我不知道这是否重要,但没有保留订单。
  • 输出顺序?没关系。如果 OP 想要按读取的顺序输出行,那将是一个更简单的脚本。相反,他想要填充一个数组,并且需要由第一个输入值提供索引,因此他计划做一些事情,而不是按照读取的顺序遍历数组,否则他希望它被 lineNr 或类似索引。显然,如果他确实想按读取顺序处理数组,他只需要在第一个循环中填充一个像 idx[lineNr]=flds[1] 这样的辅助数组来开始索引。
【解决方案2】:

不需要使用数组,因为您只需更改字段分隔符即可。

awk 'BEGIN{FS="|"}{print $1, $2}' input.txt

$0 包含整行 $1 包含索引 $2 句

【讨论】:

    【解决方案3】:

    如果记录分隔符是换行符,可以用引号展开来回显变量,照常使用awk,比如

    echo "$ArtTEXT" | awk -F"|" '{ix[NR]=$1;arr[$1]=$2} END{for(i=1;i<=NR;i++) print "arr[" ix[i] "] => " arr[ix[i]]}' 
    
    arr[1] => Reporting Problems and Bugs. 
    arr[2] => Other freely available awk implementations. 
    arr[5] => Summary of installation. 
    arr[8] => How to disable certain gawk extensions. 
    arr[3] => Making Additions To gawk. 
    arr[7] => Accessing the Git repository.
    

    由于awk 数组没有保留您需要为其保留单独索引的顺序。

    【讨论】:

    • 您假设 OP 意味着 ArtTEXT 是一个 SHELL 变量。他在他的问题中没有提到 shell,所以我假设它是一个 AWK 变量。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 2011-10-02
    • 2021-05-23
    • 2013-05-27
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多