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

kkS*_*der 2 unix csv bash shell parsing

我正在尝试解析我使用Google Spreadsheet制作的csv文件.它非常简单,用于测试目的,基本上是:

1,2
3,4
5,6

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

MacBook-Pro:Desktop kkSlider$ cat test.csv 
1,2 
3,4 
5,6MacBook-Pro:Desktop kkSlider$ 
Run Code Online (Sandbox Code Playgroud)

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

while IFS=',' read -r last first
do
    echo "$last $first"
done < test.csv
Run Code Online (Sandbox Code Playgroud)

输出是:

MacBook-Pro:Desktop kkSlider$ ./test.sh
1 2
3 4
Run Code Online (Sandbox Code Playgroud)

关于如何让它读取最后一行并回应它的任何想法?

提前致谢.

pax*_*blo 6

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

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

不幸的是,如果输入在结尾处已经有换行符,则可能会在输出结尾处产生一个空行.您可以通过一些补充来解决这个问题:

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

另一种方法依赖于这样的事实,即值被放入变量中,read但由于while语句,它们只是没有被输出:

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

那个工作没有创建另一个子shell来修改while语句的输入.


当然,我假设你想在循环中做更多的事情,只是用空格而不是逗号输出值.如果这就是你想要做的,那么还有其他工具比bashread循环更适合,例如:

tr "," " " <test.csv
Run Code Online (Sandbox Code Playgroud)