【问题标题】:Storing two columns in an array as element -> key using awk使用awk将数组中的两列存储为元素->键
【发布时间】:2016-03-08 22:08:13
【问题描述】:

假设我有文件data.log,内容如下:

[12/Mar/2015] /var/lib/file1.txt
[12/Mar/2015] /var/lib/file2.txt
[12/Mar/2015] /var/lib/file3.txt

如何使用awkbash 将此文件的内容存储到一个数组中,其中[12/Mar/2015] 是元素,/var/lib/fileN.txt 是它的键?

【问题讨论】:

    标签: arrays bash awk


    【解决方案1】:

    重击:

    # the data
    $ cat data.log
    [12/Mar/2015] /var/lib/file1.txt
    [12/Mar/2015] /var/lib/file2.txt
    [12/Mar/2015] /var/lib/file3.txt
    
    # the associative array declaration
    $ declare -A map
    
    # read the data from the file into the array
    $ while read -r date file; do map[$file]=$date; done < data.log
    
    # iterate through the data
    $ for key in "${!map[@]}"; do printf "%s => %s\n" "$key" "${map[$key]}"; done
    /var/lib/file3.txt => [12/Mar/2015]
    /var/lib/file2.txt => [12/Mar/2015]
    /var/lib/file1.txt => [12/Mar/2015]
    

    【讨论】:

    • 是的,它工作正常,但我似乎只得到这个作为输出:/var/lib/file2.txt =&gt; [12/Mar/2015] /var/lib/file1.txt =&gt; [12/Mar/2015] 没有最后一行
    • 谢谢你们。 @glenn jackman 感谢您的时间和回答。接受并升级。
    【解决方案2】:

    在 awk 中:

    $ awk '{map[$2]=$1}END{for(key in map){printf "%s => %s\n",key,map[key]}}' infile
    /var/lib/file2.txt => [12/Mar/2015]
    /var/lib/file3.txt => [12/Mar/2015]
    /var/lib/file1.txt => [12/Mar/2015]
    

    或者,作为非单行:

    # For each line, use the second field as key and the first field as value
    {
        map[$2] = $1
    }
    
    END {
        # Iterate over all keys
        for (key in map) {
            printf "%s => %s\n", key, map[key]
        }
    }
    

    这进入一个文件,例如script.awk,然后被调用

    awk -f script.awk infile
    

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多