在 bash 中解析 CSV 并分配变量

Posted

技术标签:

【中文标题】在 bash 中解析 CSV 并分配变量【英文标题】:Parse CSV in bash and assign variables 【发布时间】:2013-02-27 07:34:29 【问题描述】:

我有一个格式的 csv (Working on Bash on linux)

DN , MAC , Partition ,  

123 , abc , xyz  
321 , asd , asd 

我可以通过使用 awk 来解析它

eval MAC=($(awk -F "," 'print $1' random.csv))

这是针对 CSV 中的每一列完成的,因此我可以单独调用 DN[2]MAC[2] 等,这是手动的并单独解析它们。

但是如何按行解析 csv? 例如:如果我调用DN123,则对应的MACPartition也应该返回。

【问题讨论】:

您只想要匹配的第一行,还是应该返回所有行? 【参考方案1】:

尝试循环:

while IFS=, read dn mac partition
do 
  echo "Do something with $dn   $mac and $partition"
done < file

要选择一条记录,您可以使用 case 语句:

P2=123
while IFS=, read dn mac partition
do 
  case $dn in
    ($P2) echo echo "Do something with $dn   $mac and $partition" ;;
    (*)   echo "Do nothing" ;;
  esac
done < file

【讨论】:

使用这个我可以单独读取变量。我可以单独退回它们,但我希望它们按行阅读。例如,如果我使用变量 P2 调用第 2 行(比如说)它应该能够返回 MAC(2)、DN(2) 等【参考方案2】:

使用awk

read -p "Gimme the DN integer >>> " i
awk -v i=$i -F' , ' '
    NR>1
        dn[NR]=$1
        mac[NR]=$2
        partition[NR]=$3
    
    END
        for (a=2; a<=NR; a++)
            if (i == dn[a])
                print dn[a], mac[a], partition[a]
    
' file.txt

【讨论】:

【参考方案3】:

你也可以试试这个

file1 存储您要检索其信息的所有 DN

#parse.awk

BEGIN  FS="," ; OFS= "\t"

FNR==NR a[$1]; next 

$1 in a  print $1,$2,$3

致电awk -f parse.awk file1 csvfile.csv

【讨论】:

以上是关于在 bash 中解析 CSV 并分配变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Bash 脚本中解析 CSV?

如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

Bash:使用引号、逗号和换行符解析 CSV

Google-BigQuery - CSV 文件的架构解析

解析日期和时间格式 - Bash

在 Bash 中解析命令行参数的最佳方法是啥?