Regex“^[[:位:][$”;在AWK/GAWK中未按预期工作
我在RHEL上的呆滞版本是:Regex“^[[:位:][$”;在AWK/GAWK中未按预期工作,awk,gnu,gawk,character-class,Awk,Gnu,Gawk,Character Class,我在RHEL上的呆滞版本是: gawk-3.1.5-15.el5 我想打印一行,如果它的第一个字段有所有数字(没有特殊字符,甚至需要考虑空格) 这里出了什么问题?我的AWK版本不理解GNU字符类吗?请帮助匹配[[:digit:]字符类中的多个数字添加一个+,这意味着匹配$1中的一个或多个数字 echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/) print $0}' 123456789012345,3 这符合你的
gawk-3.1.5-15.el5
我想打印一行,如果它的第一个字段有所有数字(没有特殊字符,甚至需要考虑空格)
这里出了什么问题?我的AWK版本不理解GNU字符类吗?请帮助匹配
[[:digit:]
字符类中的多个数字添加一个+
,这意味着匹配$1
中的一个或多个数字
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/) print $0}'
123456789012345,3
这符合你的要求
一种更惯用的方法(如评论中所建议的)是删除打印
,并在行中包含直接匹配项并打印出来
echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3
还有一些例子证明了这一点
echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
(及)
不要按照要求生产任何输出a
另一种符合POSIX的方法可以通过如下方式实现严格的数字长度检查,其中,{3}
表示匹配长度
echo "123,3" | awk --posix -F, '$1 ~ /^[0-9]{3}$/'
123,3
(及)
不产生任何输出
如果您使用的是相对较新版本的bash
shell,那么它支持一个本机regEx
操作符,并使用上面的POSIX
字符类
#!/bin/bash
while IFS=',' read -r row1 row2
do
[[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
while IFS=',' read -r row1 row2
do
[[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
剧本产生了
$ bash script.sh
122,12
虽然这是可行的,bash regEx
可能会慢一些,但使用字符串操纵的相对直接的方法类似于
#!/bin/bash
while IFS=',' read -r row1 row2
do
[[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
while IFS=',' read -r row1 row2
do
[[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
当IFS=','read-r第1行第2行时
做
[[-z“${row1//[0-9]/}”]&&printf“%s,%s\n”“$row1”“$row2”
完成<文件
“${row1//[0-9]/}”
会从行中删除所有数字,并且只有当变量中没有其他字符时,条件才会变为真。请尝试以下操作,并让我知道这是否有帮助
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]*)$/) print $0}'
编辑:上述代码也可以简化为以下代码
echo "123456789012345,3" | awk -F, '($1 ~ /^[[:digit:]]*$/)'
这里您正在打印与图案匹配的每一行。这正是
grep
的目的。既然@Inian出色地告诉了您代码的错误,那么让我提出一个基于grep
的备选答案,它与awk
命令完全相同(尽管速度要快得多):
出于某种原因,专家们鼓励使用更加惯用的
awk
,如echo“123456789012345,3”|awk-F,$1~/^[:digit:]*$/'
。这不是多余的吗?@sjsam:当然是的!有时,当使用OP自己的命令并在上面进行修改时,会丢失一些微小的细节。不过接得不错!请随意编辑它,作为您的有效点!我可能不会,因为你已经谈到了op的正则表达式匹配的问题。顺便说一句,如果op有一个类似于echo“,3”|awk-F,$1~/^[:digit:]*$/'
的输入,那么它会更有趣,因为op使用的是Gnu awk的3.1.5版,您可能应该添加--posix
切换到量词({n,m}
)示例。@All:谢谢大家。我找到了我丢失的东西echo“123456789012345,3”| awk-F,{if($1~/^([[:digit:]*)$/)print$0}'
from@Ravinder或echo“123456789012345,3”| awk-F,{if($1~/^([[:digit:]+])$/)print$0}'
from@Inian就是这样做的。@xhine:我需要处理的实际文件将非常大。这就是使用awk的原因。我刚刚从我原本完整的脚本中取出了一行代码,以避免不必要的混乱,并且非常清楚我遗漏了什么,以及我期望的是什么。@dig_123如果您的文件很大,这正是为什么要选择grep
而不是awk
,后者可能慢100倍以上。除非您需要awk
中的高级功能?也许你可以把你的awk
放在grep
的输出中,我想你会看到一些真正的加速。
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]*)$/) print $0}'
echo "123456789012345,3" | awk -F, '($1 ~ /^[[:digit:]]*$/)'
grep -E '^[[:digit:]]+,'