bash - 在 bash 中解析 .csv 文件,而不是读取最后一行

标签 bash parsing shell unix csv

我正在尝试解析我用 Google 电子表格制作的 csv 文件。出于测试目的,它非常简单,基本上是:

1,2
3,4
5,6

问题是 csv 没有以换行符结尾,所以当我在 BASH 中 cat 文件时,我得到了

MacBook-Pro:Desktop kkSlider$ cat test.csv 
1,2 
3,4 
5,6MacBook-Pro:Desktop kkSlider$ 

我只想使用每个指南都建议的 while 循环在 BASH 脚本中逐行阅读,我的脚本如下所示:

while IFS=',' read -r last first
do
    echo "$last $first"
done < test.csv

输出是:

MacBook-Pro:Desktop kkSlider$ ./test.sh
1 2
3 4

关于如何让它读取最后一行并回显它有什么想法吗?

提前致谢。

最佳答案

您可以强制循环的输入以换行结束:

#!/bin/bash
(cat test.csv ; echo) | while IFS=',' read -r last first
do
    echo "$last $first"
done

不幸的是,如果输入末尾已经有换行符,这可能会导致输出末尾出现空行。您可以通过添加一些内容来解决这个问题:

!/bin/bash
(cat test.csv ; echo) | while IFS=',' read -r last first
do
    if [[ $last != "" ]] ; then
        echo "$last $first"
    fi
done

另一种方法依赖于这样一个事实,即值被 readplaced 到变量中,但由于 while 的原因,它们不会被输出 语句:

#!/bin/bash
while IFS=',' read -r last first
do
    echo "$last $first"
done <test.csv
if [[ $last != "" ]] ; then
    echo "$last $first"
fi

无需创建另一个子 shell 即可修改 while 语句的输入。


当然,我在这里假设您想在循环中做更多的事情,只输出带有空格而不是逗号的值。如果这就是您想要做的全部,还有其他工具比 bash 读取循环更适合,例如:

tr "," " " <test.csv

关于bash - 在 bash 中解析 .csv 文件,而不是读取最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11821979/

相关文章:

linux - 使用 screen 启动 minecraft 服务器(linux debian)

bash - AWS Cloudformation - 使用 cfn-init 安装软件包

parsing - Parsec:获取表达式的开始和结束源位置?

json - "Failed to invoke public scala.collection.immutable.List() with no args"使用 GSON

python - 为什么会出现 fatal error : 'yaml.h' file not found when installing PyYAML?

linux - 空格导致命令无法完成

node.js - 在 Node.js 中执行多个 shell 命令

bash - 查找与给定模式匹配并排除给定模式的所有文件?

bash - 在 bash 中快速引用标准输出(即上一个命令的输出)?

linux - echo 不会输出多行