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

Awk-检查字段是否可以转换为整数,awk,Awk,仅打印可转换为整数的字段 如果我有这个示例文本文件 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; myin

仅打印可转换为整数的字段

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

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; }
这不管用


我如何才能让它工作?

您可以使用以下模式进行匹配:

awk '$2 ~ /^[0-9]+$/'
如果要允许负值,可以执行以下操作:

awk '$2 ~ /^-?[0-9]+$/'

Awk在计算字符串时遇到问题,因此:

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

3    7
5    22
这也适用于我:
awk'$2+0'file.txt

3    7
5    22

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

谢谢,但这是我不想要的。我只想打印字符完全包含数字的字段。很抱歉,我尝试了第一个示例,但它现在不打印任何行。实际上,如果结尾没有$,它就可以工作。@user619818那么每行第二个字段的末尾都有一些控制字符
cat-v文件
以查看它们。@VaughnCato:不需要`{print}`,awk默认情况下会这样做。@EdMorton在我的测试输入文件中,第二列是最后一个字段,所以换行符在末尾。但我以为awk去掉了这个?你说“awk在计算字符串时有问题”是什么意思?你能举个例子吗?您发布的内容测试输入是实数,而不是整数。我看到OP选择了这个作为正确答案。它不是。
$echo“1e2”| awk'$1+0==$1'
生成输出
1e2
。输入“1.2”也可以试试。你是对的。Awk是弱类型的。变量没有数据类型。我所说的问题是指问题。字符串+字符串!=数字。这不是唯一的问题,它还会将以数字开头的字符串截断为数字部分,因此,如果$2是3c,那么“$2+0”将是3,因此记录将打印。wrt发布的更新
awk'/[a-z]/{next}{print$0}file.txt
,不需要
{print$0}
您需要特别检查正在处理的字段$2,因此它应该写为'awk'$2~/[a-z]/{next}',但这将允许字段使用标点符号或其他非字母数字字符,并且存在其他问题。