awk getline跳到最后一行 - 可能是换行符问题

时间:2011-10-16 05:39:27

标签: awk newline getline

我正在使用

while( (getline line < "filename") > 0 )

在我的BEGIN语句中,但是这个while循环似乎只读取文件的最后一行而不是每一行。我认为这可能是一个换行符问题,但我真的不知道。有什么想法吗?

我正在尝试从主输入文件以外的文件中读取数据。

相同的语法实际上适用于一个文件,但不适用于另一个文件,我看到的唯一区别是,当我在Vim中查看它时,它工作的那个文件在每行的末尾都有“^ M”,并且它不工作的那个没有^ M.但这对我(基于UNIX)的Mac来说似乎是一个奇怪的问题。

我希望我能理解getline的效果比我好多了。

2 个答案:

答案 0 :(得分:1)

你必须将RS指定为更模糊的东西。 这是一个让事情变得有效的丑陋黑客

RS="[\x0d\x0a\x0d]"

现在,这可能需要一些解释。 不同的系统使用不同的方式来处理线路的变化。 如果您愿意,请阅读http://en.wikipedia.org/wiki/Carriage_returnhttp://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/)实用程序预处理输入文件?