2012-08-06 77 views
2

我试图解析我用Google Spreadsheet制作的csv文件。它是用于测试目的很简单,基本上是:

1,2
3,4
5,6
在bash中解析.csv文件,而不是读取最后一行

的问题是,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 

上我怎么可能有任何想法读到最后一行,并呼应呢?

在此先感谢。

+0

我不知道你的最终目标是什么,尽管它可能会更容易坚持传统的Unix命令如'sed'或'cut'。 – chrisaycock 2012-08-06 02:53:59

回答

6

可以输入到你的循环与换行符从而结束:

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

另一种方法依赖于一个事实,即价值被放置到变量由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 
+0

非常感谢,这个伎俩!有一件事我仍然感到困惑,为什么CSV在最后一行末尾没有换行符。 – kkSlider 2012-08-06 05:56:11

+0

这将是任何程序生成文件的责任。 – paxdiablo 2012-08-06 06:22:01

2
cat file |sed -e '${/^$/!s/$/\n/;}'| while IFS=',' read -r last first; do echo "$last $first"; done 
1

如果最后(无端接)线需要从其他不同的处理,@ paxdiablo的版本与额外if声明是要走的路;但是如果要像所有其他处理那样处理,则在主循环中处理它是更清洁的。

则可以将“如果有一个未终止的最后一行”到这样的主循环条件:

while IFS=',' read -r last first || [ -n "$last" ] 
do 
    echo "$last $first" 
done < test.csv 
+0

这个诀窍适合我。谢谢 – 2016-05-28 13:36:02

相关问题