我正在使用
while( (getline line < "filename") > 0 )
在我的BEGIN语句中,但是这个while循环似乎只读取文件的最后一行而不是每一行。我认为这可能是一个换行符问题,但我真的不知道。有什么想法吗?
我正在尝试从主输入文件以外的文件中读取数据。
相同的语法实际上适用于一个文件,但不适用于另一个文件,我看到的唯一区别是,当我在Vim中查看它时,它工作的那个文件在每行的末尾都有“^ M”,并且它不工作的那个没有^ M.但这对我(基于UNIX)的Mac来说似乎是一个奇怪的问题。
我希望我能理解getline的效果比我好多了。
答案 0 :(得分:1)
你必须将RS指定为更模糊的东西。 这是一个让事情变得有效的丑陋黑客
RS="[\x0d\x0a\x0d]"
现在,这可能需要一些解释。 不同的系统使用不同的方式来处理线路的变化。 如果您愿意,请阅读http://en.wikipedia.org/wiki/Carriage_return和http://en.wikipedia.org/wiki/Newline 对它感兴趣。
通常,awk优雅地使用这个,但是在您的环境中,有些文件似乎很顽皮。 0x0d或0x0a或0x0d 0x0a(CR + LF)应该在那里,但不能混合。
让我们试一下混合数据流的例子
$ echo -e "foo\x0d\x0abar\x0d\x0adoe\x0arar\x0azoe\x0dqwe\x0dtry" |awk 'BEGIN{while((getline r )>0){print "r=["r"]";}}'
结果:
r=[foo]
r=[bar]
r=[doe]
r=[rar]
try]oe
我们可以看到最后一行丢失了。 现在使用丑陋的黑客RS
$ echo -e "foo\x0d\x0abar\x0d\x0adoe\x0arar\x0azoe\x0dqwe\x0dtry" |awk 'BEGIN{RS="[\x0d\x0a\x0d]";while((getline r )>0){print "r=["r"]";}}'
结果:
r=[foo]
r=[bar]
r=[doe]
r=[rar]
r=[zoe]
r=[qwe]
r=[try]
我们可以看到每一行都获得,不管0x0d 0x0a垃圾: - )
答案 1 :(得分:0)
也许您应该使用例如dos2unix(http://sourceforge.net/projects/dos2unix/)实用程序预处理输入文件?