在bash中读取CSV文件

时间:2012-10-08 14:02:31

标签: linux bash shell csv

我需要在shell中读取CSV文件,我很好,CSV文件在单元格中有单行。但是如果CSV文件的单元格中有多行,则无法分隔CSV文件。

Filename            Lines
/etc/hosts          example.test.com
                    example2.test.com
/etc/resolv.conf    nameserver dns.test.com
                    search test.com

我将从CSV文件中获取用户的输入,并且必须将给定的行添加到提到的文件中。这里有一个CSV文件的每个单元格中有多行,如果我试图捕获该文件,它将以不同的顺序给出。

[user2@mon ~]$ cat test2.csv
"Filename","Lines"
"/etc/hosts","example.test.com"
,"example2.test.com"
"/etc/resolv.conf","nameserver dns.test.com"
,"search test.com"

我们有什么方法可以读取该文件中的多行,并且行数始终不相同。

2 个答案:

答案 0 :(得分:2)

这可能就是你所追求的:

awk -F, '{ sub(/^"/, "", $1); sub(/"$/, "", $1);
           sub(/^"/, "", $2); sub(/"$/, "", $2);
           printf "%-20s  %s\n", $1, $2;
         }'

如果您花费更多时间手动抨击,很可能会压缩替代操作。这是一个脆弱的解决方案(大多数不使用专门用于处理CSV格式的代码的解决方案都很脆弱);如果逗号出现在任何引号括起的字段中,它就会失败。

应用于您的数据,它会产生:

Filename              Lines
/etc/hosts            example.test.com
                      example2.test.com
/etc/resolv.conf      nameserver dns.test.com
                      search test.com

可靠地操纵CSV格式数据的其他工具包括:

如果这不是您要找的,请澄清问题。

答案 1 :(得分:2)

假设您的输入与示例一样基本,您可以轻松完成:

sed 's/^,/ ,/' test2.csv | tr -d \" | column -s, -t