使用Bash读取和处理CSV文件的方法

 更新时间:2023年02月16日 11:13:45   作者:水滴石穿_wang  
本文主要介绍了使用Bash读取和处理CSV文件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

介绍

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

如何使用 cut 命令

作为读取 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 文件作为参数执行脚本

$ ./hoge.sh hoge.csv 
col1:a1 col2:a2 col3:a3
col1:b1 col2:b2 col3:b3
col1:c1 col2:c2 col3:c3
$ 

如何使用 IFS 将列存储在变量中

通过将分隔符 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

如何使用 IFS 将列存储在数组中(●)

您还可以使用 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
$ ./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
$ 
$ ./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 文件,替换特定字符,然后读取它,您可以在读取 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
$ 
$ ./hoge.sh hoge.csv 
col1:c1 col2:c2 col3:c3
col1:b1 col2:b2 col3:b3
col1:a1 col2:a2 col3:a3
$ 

如何使用awk命令

如果您想轻松处理或聚合 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • shell传参并将参数传递给sql文件的方法

    shell传参并将参数传递给sql文件的方法

    今天小编就为大家分享一篇shell传参并将参数传递给sql文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 每天学一个 Linux 命令之more命令

    每天学一个 Linux 命令之more命令

    more命令,功能类似 cat ,more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能
    2016-12-12
  • 简化shell终端命令输入的脚本式快捷键工具

    简化shell终端命令输入的脚本式快捷键工具

    这篇文章主要介绍了简化shell终端命令输入的脚本式快捷键工具,这是一个shell脚本写的简化shell命令输入的快捷键工具,需要的朋友可以参考下
    2015-03-03
  • linux shell中实现循环日期的实例代码

    linux shell中实现循环日期的实例代码

    这篇文章主要介绍了linux shell中实现循环日期的实例代码,文中还给大家提到了LINUX SHELL遍历日期(指定输入两个日期)的实现方法,感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • Linux截取某一段时间的日志问题

    Linux截取某一段时间的日志问题

    这篇文章主要介绍了Linux截取某一段时间的日志问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Linux中的host命令应用实例详解

    Linux中的host命令应用实例详解

    这篇文章主要介绍了Linux中的host命令应用举例的相关资料,需要的朋友可以参考下
    2017-07-07
  • shell自动拉取镜像并运行容器的shell脚本

    shell自动拉取镜像并运行容器的shell脚本

    本文主要介绍了shell自动拉取镜像并运行容器的shell脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • linux type命令用法实战教程

    linux type命令用法实战教程

    type命令用来显示指定命令的类型,它是Linux系统的一种自省机制,知道了是那种类型,我们就可以针对性的获取帮助,这篇文章主要介绍了linux type命令用法实战教程,需要的朋友可以参考下
    2023-05-05
  • Shell字符串截取的实现方法(非常详细)

    Shell字符串截取的实现方法(非常详细)

    这篇文章主要介绍了Shell字符串截取的实现方法(非常详细),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 详解Linux ln 命令

    详解Linux ln 命令

    Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体链接文件,Symbolic Link 文件则常被称为符号链接、软链接文件。这篇文章主要介绍了Linux ln 命令 ,需要的朋友可以参考下
    2019-08-08

最新评论