使用getline时出现奇怪的awk打印结果

使用getline时出现奇怪的awk打印结果,awk,gawk,Awk,Gawk,我有一个文本文件file.txt,具有以下上下文 3 7 我发现 awk 'BEGIN{while((getline i<"file.txt")>0){print i}}' 3 7 awk 'BEGIN{while((getline i<"file.txt")>0){print (i>10)}}' 1 1 awk 'BEGIN{while((getline i<"file.txt")>0){print (i>4)}}' 0 1 awk 'BEGI

我有一个文本文件
file.txt
,具有以下上下文

3
7
我发现

awk 'BEGIN{while((getline i<"file.txt")>0){print i}}'
3
7
awk 'BEGIN{while((getline i<"file.txt")>0){print (i>10)}}'
1
1
awk 'BEGIN{while((getline i<"file.txt")>0){print (i>4)}}'
0
1
awk 'BEGIN{while((getline i<"file.txt")>0){print (i>8)}}'
0
0
awk'BEGIN{while((getline i0){print i}}'
3.
7.
awk'BEGIN{while((getline i0){print(i>10)}'
1.
1.
awk'BEGIN{while((getline i0){print(i>4)}'
0
1.
awk'BEGIN{while((getline i0){print(i>8)}'
0
0
为什么会出现这种奇怪的行为?

使用4.1.0(Windows版本)测试了这一点:

$cat文件
3.
7.
$awk“开始{while((getline i0){print(i>10)}”
0
0
$awk“开始{while((getline i0){print(i>9)}”
0
0
$awk“开始{while((getline i0){print(i>8)}”
0
0
$awk“开始{while((getline i0){print(i>7)}”
0
0
$awk“开始{while((getline i0){print(i>6)}”
0
1.
$awk“开始{while((getline i0){print(i>5)}”
0
1.
$awk“开始{while((getline i0){print(i>4)}”
0
1.
$awk“开始{while((getline i0){print(i>3)}”
0
1.
$awk“开始{while((getline i0){print(i>2)}”
1.
1.
$awk“开始{while((getline i0){print(i>1)}”
1.
1.
$awk“开始{while((getline i0){print(i>0)}”
1.
1.
正常行为。

如果可能,大多数实现(选中gawk和mawk)都会将字段和行转换为数字。但您的实现可能不适用于getline。在这种情况下:

这就是字符串比较的工作原理,“3”大于“10”:

尝试将其强制为数字:

awk 'BEGIN {print (+"3">10)}'
0
awk 'BEGIN {print (+"11">10)}'
1

奇怪的行为是>10的结果,它应该与>8的结果相同(并且在我的系统上)。否则,awk计算i是否大于给定值并返回True或False。既然您发布了一个getline循环来演示该问题,我们是否可以假设如果您让awk正常处理输入(即不使用getline)您没有看到这个问题吗?换句话说,
awk'$0>10'
等是否会产生与上述相同的结果或不同的结果?我强烈怀疑您刚刚在Windows上创建了文件,因此在每行末尾都有控件Ms,或者文件中有其他类型的控件字符,导致awk将输入视为字符串和字符串整个getline问题都是一个麻烦事。在输入文件上运行
cat-v文件
,并用结果更新您的问题,这样我们就可以准确地看到其中的内容。另外,将
print i
更改为
printf“\n”,我在你的代码中
,并用结果更新你的问题。那么,为什么awk在发问者的系统中使用字符串比较,而在我和第一个回答的人身上使用数字比较呢?教我明确,就像你演示的那样,以获得可靠的结果。它也适用于我的
awk
@learning:你在使用什么awkg?
+
解决问题了吗?你的答案离题了,在OP的问题上没有字符串可供发现。@captcha:gawk和mawk将字段转换为数字,如果它们是数字的话。不确定其他实现。这是我能想到的唯一解释。我更新了我的答案。注意:如果你把“3”在文件中,字符串将是:“
”3“
”,而不仅仅是字符串
3
@captcha:然后向我解释learning是如何获得i>10的结果的。在我确认这是一个打字错误之前,我将learning的问题解释为要求对awk语句进行准确解释-在不同的操作系统上不同版本的不同行为仍然是一种可能性。另一种可能性可能是文本文件中的隐藏字符,这使得awk将输入解释为字符串而不是数字。
awk 'BEGIN {print (+"3">10)}'
0
awk 'BEGIN {print (+"11">10)}'
1