Regex AWK匹配以数字开头的字符串
我想使用Regex AWK匹配以数字开头的字符串,regex,bash,unix,awk,Regex,Bash,Unix,Awk,我想使用awk打印文件的所有行,其中每行的第一个元素以数字开头。以下是文件中包含的数据和使用的命令的详细信息: awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename 文件名内容: 12.44.4444goad ABCDEF/END LMNOP/START joker 98.0 kites 使用的命令: awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename 运行上述命令后,提示符上不会显示任何结果。 请告诉我是否需要对上
awk
打印文件的所有行,其中每行的第一个元素以数字开头。以下是文件中包含的数据和使用的命令的详细信息:
awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename
文件名内容:
12.44.4444goad ABCDEF/END
LMNOP/START joker
98.0 kites
使用的命令:
awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename
运行上述命令后,提示符上不会显示任何结果。
请告诉我是否需要对上述命令进行任何更正。放下大括号和
\d
,如下所示:
awk ' $1 ~ /^[0-9]/ ' filename
Awk程序分块提供。块是模式
块
对,其中块
默认为{print}
。(空模式默认为true)
/\d/
是一个perl ism,可能在某些版本的awk
中工作—在我尝试过的版本中不工作*。您需要传统的/^[0-9]/
或POSIX/^[:digit:]/
符号
*
gnu和ast要打印以数字开头的行,可以尝试以下操作:
awk '/^[[:digit:]]+/' file
正如@HenkLangeveld所指出的,您的语法不正确。此外,正则表达式
\d
在awk中不可用。从您尝试的解决方案来看,您似乎想要:
awk 'NF>1 && $1 ~ /^[0-9.]*$/' filename
perl -lane 'use POSIX qw(strtod); my ($num, $end) = strtod($F[0]);
print unless $end;' filename
如果要包含小数点,需要显式匹配
,并且需要$
锚定以使*
有意义。这将丢失第一列看起来像5e39
或-2.3
的行。您可以尝试使用以下方法来捕获这些案例:
awk 'NF>1 && $1 ~ /^-?[0-9.]*(e[0-9*])?$/' filename
但是在这一点上,我要告诉您使用perl
,不要再尝试使用awk
来增强健壮性。
可能(这将打印空行…不确定您想要哪种行为):
这将使用strtod解析数字,并告诉您字符串末尾不属于该数字的字符数。如果您只需要在行首匹配至少一个数字,则只需
^
匹配行首和[0-9]
匹配数字即可
您可以将花括号与if
语句一起使用:
awk '{if($1 ~ /^[0-9]/) print $0}' filename
但这只是一个简单的例子:
awk '$1 ~ /^[0-9]/' filename
从技术上讲,语法是正确的。;-)结果恰好相当于
{1}
或{0}
@HenkLangeveld是的,根据awk,语法是正确的,但不符合人类的意图:)感谢Håkon的输入。错误的词是“语义”。该代码在语法上是有效的,但在语义上没有达到预期效果。不需要+
,只要/^[:digit:][]/
就足够了。感谢William的输入。另外,我不能使用perl,因为手头的任务只允许使用unix命令。感谢Henk的输入Hanks John的输入。行的开头可以有空格吗?如果是这样,请在您发布的示例输入/输出中显示一个示例。我们应该测试$1
还是$0
,这会产生不同。行首将没有空格。此外,我还能够使用Håkon、William、Henk和John的建议完成任务。