在 awk 中打印第一个变量,但前提是它小于 X

Printing First Variable in Awk but Only If It's Less than X

我有一个包含文字的文件,我只需要打印少于或等于 4 个字符的行,但我的代码遇到了问题。行尾还有其他文字,但我在这里将其缩短。

文件:

John Doe 
Jane Doe
Mark Smith
Abigail Smith
Bill Adams

我想做的是打印少于 4 个字符的名字。

我尝试过的:

awk ' <= 4 {print }' inputfile

我希望得到的:

John 
Jane
Mark
Bill

到目前为止,我一无所获。它要么打印出所有内容,没有长度限制,要么根本不打印任何内容。有人可以看看这个并看看他们的想法吗? 谢谢

首先,让我们明白为什么

awk ' <= 4 {print }' inputfile

给你整个inputfile <= 4是数字比较,所以这提示GNU AWK尝试将第一列值转换为数值,但是什么是数值

John

?正如 GNU AWK manual Strings And Numbers 所说

A string is converted to a number by interpreting any numeric prefix of the string as numerals(...)Strings that can’t be interpreted as valid numbers convert to zero.

因此,从 GNU AWK 的角度来看,John 的数值为零。

为了获得所需的输出,您可以使用 length 函数,其中 returns 个字符如下

awk 'length()<=4{print }' inputfile

或者从 0 到 4 个字符的模式匹配

awk '~/^.{0,4}$/{print }' inputfile

其中 ~ 表示检查第一个字段是否匹配,. 表示任何字符,{0,4} 从 0 到 4 次重复,^ 字符串开头,$ 字符串结尾(这 2 个是必需的,否则它也会匹配更长的字符串,因为它们确实包含子字符串 .{0,4}

输入文件的两个代码

John Doe 
Jane Doe
Mark Smith
Abigail Smith
Bill Adams

给出输出

John
Jane
Mark
Bill

(在 gawk 4.2.1 中测试)