【问题标题】:Parse a txt file into an array using bash and awk [duplicate]使用 bash 和 awk 将 txt 文件解析为数组 [重复]
【发布时间】:2021-03-27 14:46:19
【问题描述】:

我有以下名为 test.csv

的 CSV 文件
First Line, 100
Second Line, 200
Third Line, 300
Fourth Line, 400

我想用逗号分隔每一行,并使用 awk 将第一部分存储到 bash 脚本中的数组中。 我做了以下事情:

#!/bin/bash
declare -a MY_ARRAY

MY_ARRAY=$(awk -F ',' '{print $1}' test.csv)
echo 'Start'
for ENTRY in ${MY_ARRAY}
do
echo ${ENTRY}
done
echo 'Stop'

输出如下:

Start
First
Line
Second
Line
Third
Line
Fourth
Line
Stop

如何让数组保存以下内容?:

First Line
Second Line
Third Line
Fourth Line

【问题讨论】:

  • 为什么要使用awk 来填充bash 数组?在任何情况下,直接使用 bash 会更容易。由于字段内的空格,无论如何您需要比array=( $(awk ...) ) 更多的bash 代码(注意$( )` 周围的( );你忘记了它们)。
  • 当前代码的一些问题:a) 为数组赋值通常需要将赋值的右侧包装在父母中,例如,MY_ARRAY=( $(awk ... ) )b) 因为awk 输出行包含空格,您需要将默认字段分隔符重新定义为\n,以便正确解析到数组中,例如IFS=$'\n' MY_ARRAY=( $(awk ... ) )(全部在一行,所以IFS 重定义仅适用于该命令); c) 要引用数组的各个元素,您需要一个通配符匹配索引(包装在[]'s 中),例如for ENTRY in "${MY_ARRAY[@]}"

标签: linux bash shell awk


【解决方案1】:

如果你想为 csv 文件的第一列分配一个 bash 数组,你不必使用awk。请改用:

readarray -t my_array < <(cut -d, -f1 test.csv)
for e in "${my_array[@]}"; do
    echo "$e"
done

输出:

First Line
Second Line
Third Line
Fourth Line
  • cut -t, -f1 file 命令以逗号分隔每一行并打印第一个字段。
  • 表达式&lt;(command) 是一个进程替换,可以重定向 将命令输出到另一个命令(在这种情况下为readarray)。
  • 命令readarray -t my_array 从标准输入读取行并将my_array 分配给这些行。

回到您发布的脚本,变量MY_ARRAY 未分配 作为一个数组。它只包含一个包含空格的字符串 和换行符。如果它被称为for ENTRY in ${MY_ARRAY},则字符串 由于word splitting,在空格和换行符上被拆分 bash。

【讨论】:

    【解决方案2】:
    $ cat input 
    First Line, 100
    Second Line, 200
    Third Line, 300
    Fourth Line, 400
    
    $ cat so.sh 
    #!/bin/bash
    
    while IFS=',' read -r -a array; do
        echo $array
    done
    
    $ cat input | ./so.sh 
    First Line
    Second Line
    Third Line
    Fourth Line
    
    
    

    【讨论】:

    • 我需要脚本来打开文件并阅读它,而不是把它放到脚本中
    • @HarryBoy 但这就是如何在 bash 中读取文件。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2014-11-02
    • 2018-03-31
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多