Content

使用Bash读取和处理CSV文件的方法(bash读取文件内容到变量)真没想到

文章摘要

这篇文章介绍了如何使用Bash脚本、IFS环境变量和awk命令来处理CSV文件。主要内容如下: 1. **使用Bash脚本和`cut`命令**:通过逐行读取CSV文件并使用`cut`命令分列存储在变量中,适用于简单的CSV文件处理,但处理空字段时可能会出现问题。 2. **使用IFS环境变量和`read`命令**:通过将分隔符环境变量设置为逗号(,),并在`read`命令中使用分列功能,可以灵活处理不同分隔符(如逗号、空格、换行符)的CSV文件。使用`-a`选项将列存储在数组中,方便循环处理和灵活引用。 3. **使用awk命令**:awk命令能够自动处理分隔符并存储字段在变量中,语法简单,适合一次性处理CSV文件。可以通过 `-F` 选项指定分隔符类型,支持逗号、空格、制表符等分隔符。 文章对比了这三种方法的优缺点,并强调了它们在处理不同分隔符和空字段情况时的适用性。总体而言,awk命令因其简单性和扩展性成为处理CSV文件的首选工具。 总结:文章详细介绍了三种处理CSV文件的方法,分别突出了它们的特点和适用场景,帮助读者选择最适合的处理方式。


目录介绍如何使用 cut 命令如何使用 IFS 将列存储在变量中如何使用 IFS 将列存储在数组中(●)对于空格或制表符分隔的文件如何处理要读取的CSV文件如何使用awk命令

我将介绍它,因为在使用 Linux Bash 脚本读取简单的 CSV 文件并对其进行处理时,它非常容易编写。

作为读取 CSV 文件并使用您经常看到的 Bash 脚本对其进行处理的方法,有一种描述是从标准输入中逐行读取 CSV 文件并使用 cut 命令将列存储在变量中。

hoge.sh 的内容

?#!/bin/bash while read line do ? # 保存 $line 行中读入的CSV文件的一行文本,通过cut命令分列保存在变量中。 ? col1=$(echo ${line} | cut -d , -f 1) ? col2=$(echo ${line} | cut -d , -f 2) ? col3=$(echo ${line} | cut -d , -f 3) ? # 处理内容描述在这里 ? # $colX 参考读入的 CSV 文件的文本 ? echo “col1:$col1 col2:$col2 col3:$col3” done < $1

csv文件的内容

$ cat hoge.csv a1,a2,a3 b1,b2,b3 c1,c2,c3 $

以 csv 文件作为参数执行脚本

$ https://www.jb51.net/article/hoge.sh hoge.csv col1:a1 col2:a2 col3:a3 col1:b1 col2:b2 col3:b3 col1:c1 col2:c2 col3:c3 $

通过将分隔符 IFS 的环境变量更改为,并在 read 命令中设置多个变量,可以在不使用 cut 命令的情况下进行简单的描述。

hoge.sh 的内容

?#!/bin/bash ?# 将读取的CSV文件的一行文本分列存储在多个变量中 while IFS=, read col1 col2 col3 do ? # 处理内容描述在这里 ? # $colX 参考读入的 CSV 文件的文本 ? echo “col1:$col1 col2:$col2 col3:$col3” done < $1

您还可以使用 read 命令的 -a 选项将拆分列存储在数组中。

?#!/bin/bash while IFS=, read -a col do ? echo “col1:${col[0]} col2:${col[1]} col3:${col[2]}” done < $1

这种方式是最推荐的,因为它是一个数组,所以很容易循环、添加、删除、处理分列,并且可以灵活的引用和使用变量扩展来展示。

#!/bin/bash while IFS=, read -a col do ? for c in ${col[@]} ? do ? ? echo “loop:$c” ? done ? unset col[2] ? col+=(lastcol) ? echo “${col[@]}” ? echo “${col[@]:1}” ? echo “${col[@]/#/col:}” done < $1
$ https://www.jb51.net/article/hoge.sh hoge.csv loop:a1 loop:a2 loop:a3 a1 a2 lastcol a2 lastcol col:a1 col:a2 col:lastcol loop:b1 loop:b2 loop:b3 b1 b2 lastcol b2 lastcol col:b1 col:b2 col:lastcol loop:c1 loop:c2 loop:c3 c1 c2 lastcol c2 lastcol col:c1 col:c2 col:lastcol $

如果文件分隔符是空格分隔符(SSV)或制表符分隔符(TSV),则分隔符的环境变量IFS默认为空格、制表符和换行符,因此在脚本中不指定IFS进行处理.我可以的。

?#!/bin/bash while read -a col do ? echo “col1:${col[0]} col2:${col[1]} col3:${col[2]}” done < $1

但是,如果该列为空,则将省略其前后连续的空格和制表符,并将变量位置打包在一起。

$ cat hoge.ssv a1 a2 a3 b1 b3 c3 $
$ https://www.jb51.net/article/hoge.sh hoge.ssv col1:a1 col2:a2 col3:a3 col1:b1 col2:b3 col3: col1:c3 col2: col3: $

为了防止这种情况,您需要用逗号替换空格和制表符,并将它们读入以逗号分隔的数组。

?#!/bin/bash IFS=, while read line do ? col=(${line// /,}) ? echo “col1:${col[0]} col2:${col[1]} col3:${col[2]}” done < $1
#!/bin/bash IFS=, while read line do ? col=(${line//$’\t’/,}) ? echo “col1:${col[0]} col2:${col[1]} col3:${col[2]}” done < $1

如果您想以相反的顺序读取 CSV 文件,替换特定字符,然后读取它,您可以在读取 CSV 文件之前对其进行处理,方法是将进程替换的结果 <() 传递给标准输入。

?#!/bin/bash while IFS=, read -a col do ? echo “col1:${col[0]} col2:${col[1]} col3:${col[2]}” done < <(tac $1)
$ cat hoge.csv a1,a2,a3 b1,b2,b3 c1,c2,c3 $
$ https://www.jb51.net/article/hoge.sh hoge.csv col1:c1 col2:c2 col3:c3 col1:b1 col2:b2 col3:b3 col1:a1 col2:a2 col3:a3 $

如果您想轻松处理或聚合 CSV 文件,使用 awk 命令处理它可能会更简单。

awk命令从头开始逐行读取指定为参数的文件,自动将分隔符分隔的内容存储在变量$1,$2…中,可以逐行描述要处理的内容。处理 CSV 文件时,需要在 -F 选项中指定逗号作为分隔符。
$ awk -F, ‘{print “col1:”$1,”col2:”$2,”col3:”$3}’ hoge.csv col1:a1 col2:a2 col3:a3 col1:b1 col2:b2 col3:b3 col1:c1 col2:c2 col3:c3 $

此外,如果处理内容变得复杂,则可以将处理内容描述在文件中作为脚本。

{ print “col1:”$1,”col2:”$2,”col3:”$3 }
$ awk -F, -f hoge.awk hoge.csv col1:a1 col2:a2 col3:a3 col1:b1 col2:b2 col3:b3 col1:c1 col2:c2 col3:c3 $

如果文件分隔符是空格分隔 (SSV) 或制表符分隔 (TSV),则无需像 Bash 脚本那样指定选项即可读取,但由于变量位置已打包并存储,因此指定选项更安全。

$ awk -F'[. ]’ ‘{print “col1:”$1,”col2:”$2,”col3:”$3}’ hoge.ssv col1:a1 col2:a2 col3:a3 col1:b1 col2: col3:b3 col1: col2: col3:c3 $
$ awk -F'[.\t]’ ‘{print “col1:”$1,”col2:”$2,”col3:”$3}’ hoge.tsv col1:a1 col2:a2 col3:a3 col1:b1 col2: col3:b3 col1: col2: col3:c3 $

awk 命令也是一个功能强大的命令,但是还有一种方法是使用 perl 命令来处理 CSV 文件,这种方法更加直观和复杂。

这是一个非常复杂的命令,默认包含在 Linux 服务器中,所以如果您有兴趣,可以使用它。

到此这篇关于使用Bash读取和处理CSV文件的方法的文章就介绍到这了,更多相关Bash读取和处理CSV内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:PowerShell操作Excel、CSV详细介绍