我正在尝试解析类似于以下内容的逗号分隔文件,并将每个字段提取到变量中:
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。
答案 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