3

我正在尝试解析我使用 Google 电子表格制作的 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$ 

我只想使用每个指南建议的 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

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

提前致谢。

4

3 回答 3

7

您可以强制循环的输入以换行符结束,因此:

#!/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

另一种方法依赖于这样一个事实,即这些值是由 the放入变量中的,但由于以下语句read,它们只是没有被输出: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
于 2012-08-06T02:57:25.800 回答
2
cat file |sed -e '${/^$/!s/$/\n/;}'| while IFS=',' read -r last first; do echo "$last $first"; done
于 2012-08-06T04:54:53.160 回答
1

如果最后(未终止的)行需要与其他行不同的处理,@paxdiablo 的带有额外if语句的版本是要走的路;但是如果要像所有其他人一样处理它,那么在主循环中处理它会更干净。

您可以将“如果最后一行未终止”滚动到主循环条件中,如下所示:

while IFS=',' read -r last first || [ -n "$last" ]
do
    echo "$last $first"
done < test.csv
于 2012-08-06T07:24:34.847 回答