【发布时间】:2016-01-21 17:40:31
【问题描述】:
这里是交易:我需要读取一个特定数量的字节,稍后将处理它。但是我遇到了一个奇怪的现象,我无法理解它。也许是其他人? :)
注意:以下代码示例是精简版本,只是为了展示效果!
至少使用gawk 的一种方法是将RS 设置为一个包罗万象的regex,然后使用RT 来查看匹配的内容:
RS="[\x00-\xFF]"
然后,非常简单地使用以下 awk-script:
BEGIN {
ORS=""
OFS=""
RS="[\x00-\xFF]"
}
{
print RT
}
这工作正常:
$ echo "abcdef" | awk -f bug.awk
abcdef
但是,我需要几个文件才能访问,所以我不得不使用getline:
BEGIN {
ORS=""
OFS=""
RS="[\x00-\xFF]"
while (getline)
{
print RT
}
}
这貌似和上面的一样,但是运行的时候,有一个令人讨厌的惊喜:
$ echo "abcdef" | awk -f bug.awk
abc
这意味着,出于某种原因,getline 遇到了 EOF 条件提前 3 个字节。那么,我是否遗漏了什么,我应该了解 bash/Linux 缓冲的内部机制,还是发现了一个可怕的 bug?
仅作记录:我在 Ubuntu 14.04 LTS (Linux 3.13.0/36) 上使用 GNU Awk 4.0.1
有什么建议吗,伙计们?
更新:我正在使用getline,因为我之前已经读取并预处理了文件,并存储在文件/dev/shm/ 中。然后我需要做一些最后的处理步骤。上面的例子只是最基本的脚本,用来说明问题。
【问题讨论】:
-
我现在没有办法对此进行测试,但我希望
awk能够在不需要 getline 的情况下从 cmd-line 中获得文件列表。您是否尝试过使用多个文件的原始代码? pluse-uno 用于深入研究的问题。但是,是的,您的测试似乎应该可以工作,并且不清楚您丢失数据的原因。哦..您的数据中有\r\n行结尾的机会吗?如果是这样,dos2unix file或... | tr -d '\015' | ...。继续发帖,祝你好运。 -
好吧,我正在做的是从
stdin读取数据,并将其放入/dev/shm的临时文件中,然后再读取该文件并进行一些处理。 (数据应该来自网络nc)非常感谢,我正在尽我所能......;) -
嗯..您说“但是,我需要几个文件才能访问,..”。对于其他读者,您可能想澄清您的
echo abcedfg | awk ..反映了您真正想要如何处理这个问题。祝你好运! -
为了好玩,可以尝试在
while循环之后放置一个print ""--- 以防有一些挥之不去的输出由于某种原因没有被刷新。 -
I'll need several files, to be accessed, so I am forced to use getline- 该声明完全不清楚,因为 awk 在读取多个文件时不需要 getline,一旦您告诉我们您是从stdin而不是从任何文件中读取,它就变得更加不清晰.请编辑您的问题以明确说明 awk 从何处获取输入,如果您认为需要使用getline,请明确说明为什么会这样。您可能还想阅读awk.info/?tip/getline。