Awk - 检查一个字段是否可以转换为整数

11

只有当字段可以转换为整数时才打印

如果我有这个示例文本文件

1 cat
2 dog
3 7
4 fish5
5 22

我希望我的awk脚本只打印可以转换为整数的字段。

我不想要打印第1、2和4行。

示例awk脚本

BEGIN {
   print "testing conversion to integer on " ARGV[1];
   myinteger = 0;  # my atmept to force this var to an integer
}
 myinteger = $2;
 myinteger != 0 { print $2; }

这个不起作用。

我该如何让它起作用?

2个回答

11

Awk有计算字符串的问题,因此:

awk '$2 + 0 == $2' file.txt

3    7
5    22

这对我也适用:awk '$2 + 0' file.txt

但是,正如Ed Morton在评论中指出的那样,这也会包括以数字开头的字符串,因此可能更正确的方法是:awk '/[a-z]/{next}{print $0}' file.txt,即如果行中有字母,则跳到下一行。


1
我看到楼主将其选为正确答案。但它并不是正确的。 $ echo "1e2" | awk '$1 + 0 == $1' 的输出是 1e2,请尝试输入 "1.2" - Ed Morton
不,awk很明智。虽然Python可以计算字符串,但不计算字符串是有道理的:foo + bar = foobar,这对它们来说没问题。 - AWE
唯一的问题是,如果该值实际上为“0”,它将不会被打印。 - glenn jackman
1
这不是唯一的问题,它还会将以数字开头的字符串截断为仅包含数字部分,因此如果$2是3c,那么'$2 + 0'将变成3,因此记录将被打印。 - Ed Morton
1
关于发布的 awk '/[a-z]/{next}{print $0}' file.txt 更新,不需要 {print $0},你需要特别检查你正在处理的字段 $2,所以应该写成 awk '$2~/[a-z]/{next}',但这将允许带标点符号或其他非字母数字字符的字段,并且还有其他问题。 - Ed Morton
显示剩余3条评论

9
您可以使用模式进行匹配:
awk '$2 ~ /^[0-9]+$/'

如果您想允许负数值,可以这样做:
awk '$2 ~ /^-?[0-9]+$/'

谢谢,但这会打印出我不想要的fish5。我只想打印出那些字符仅包含数字的字段。 - Angus Comber
很抱歉打扰您,但我尝试了第一个示例,它现在没有打印任何行。实际上,如果去掉末尾的$符号,它就可以工作。 - Angus Comber
@user619818,然后每行第二个字段末尾有一些控制字符。使用“cat -v file”命令查看它们。 - Ed Morton
@VaughnCato:不需要使用 { print },这是awk默认的操作。 - Ed Morton
@EdMorton 在我的测试输入文件中,第二列是最后一个字段 - 因此在末尾有换行符。但我以为awk会去掉这个? - Angus Comber
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接