使用while循环在bash脚本中解析逗号分隔文件

时间:2016-06-26 16:59:43

标签: bash shell parsing scripting command

我正在尝试解析类似于以下内容的逗号分隔文件,并将每个字段提取到变量中:

bob,mechanic,single,swimming,/bob/tmp,batman,
joe,architect,married,tennis,/joe/tmp,superman,34

使用此脚本:

#!/bin/bash

#|| [[ -n "$input" ]]

while IFS=, read -r a b c d e f g; do
    echo "$a"

done < "commafile.txt"

但是当我从命令行运行带有./parsecommas的脚本(称为parsecommas)时,脚本会立即终止而没有任何输出。

我做错了什么?我正在运行OSX Yosemite并使用xcode编辑脚本,然后终端运行它。我检查了有缺陷的隐形物,但没有找到。 commafile.txt与bash脚本parsecommas位于同一目录中。

编辑:在运行c ++程序并且只能读取文件的最后一行之后,我意识到这个问题可能不是我的代码,而是我用来创建文本文件的方法。我用了

touch commafile.txt

创建我的文件,我只能在c ++程序中使用getline(file,line)时读取文件的最后一行。有没有其他人遇到过这个问题?我的Mac /文本编辑器出了什么问题?

cat commafile.txt

仅打印文件中的最后一行,而当我在XCode或TextEditor中打开文件时,将显示所有行。我将盒子形状字段中doc字的内容复制粘贴到commafile.txt。

1 个答案:

答案 0 :(得分:1)

如果cat filename仅打印最后一行,这意味着您的文件几乎肯定会使用CR(回车符\r)而不是LF(\n)或CRLF({{1} })换行符。您可以通过创建文件来重现此错误,如下所示:\r\n

这导致printf '%s\r' "bob,mechanic,single,swimming,/bob/tmp,batman," "joe,architect,married,tennis,/joe/tmp,superman,34" >commafile.txt仅显示文件的最后一行,因为cat字符会导致光标在转换时返回到同一行的开头记录。这解释了您的错误,因为\r shell内置版需要一个有效的UNIX行,该行由read终止;如果您的代码不包含\n,那么\n将返回false值,循环将不会运行。

您可以按照以下方式解决此问题:

read

或者,您可以通过将# replace \r characters with \n tr '\r' '\n' <commafile.txt >commafile.fixed && mv commafile{.fixed,.txt} 传递给-d $'\r'来修改循环以期望此格式而不是标准UNIX文本文件:

read