4

我在 RHEL 上的 GAWK 版本是:

gawk-3.1.5-15.el5

如果它的第一个字段包含所有数字,我想打印一行(没有特殊字符,甚至要考虑空格)

Example:

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^[[:digit:]]$/)  print $0}'

Output:
Nothing

Expected Output:
123456789012345,3

这里出了什么问题?我的 AWK 版本不理解 GNU 字符类吗?请帮助

4

3 回答 3

5

要匹配[[:digit:]]字符类中的多个数字,请添加一个+,这意味着匹配 中的一个或多个数字$1

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/)  print $0}'
123456789012345,3

满足您的要求。

一种更惯用的方法(如评论中所建议的那样)是删除print并包含在线上的直接匹配并打印它,

echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3

更多的例子证明了这一点,

echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'

(和)

echo "aa,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'

不要根据要求产生任何输出。

POSIX一种对数字进行严格长度检查的合规方法可以通过以下方式实现,其中{3}表示匹配长度。

echo "123,3" |  awk --posix -F, '$1 ~ /^[0-9]{3}$/'
123,3

(和)

echo "12,3" |  awk --posix -F, '$1 ~ /^[0-9]{3}$/'

不产生任何输出。

如果您使用的是相对较新版本的bashshell,它支持具有上述using字符类的本机regEx运算符,例如~POSIX

#!/bin/bash

while IFS=',' read -r row1 row2
do
   [[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file

对于输入文件说file

$ cat file
122,12
a1,22
aa,12

脚本产生,

$ bash script.sh
122,12

虽然这可行,bash regEx但使用字符串操作的相对直接的方式可能会更慢,例如

while IFS=',' read -r row1 row2
do
   [[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file

删除行中的"${row1//[0-9]/}"所有数字,并且仅当变量中没有其他字符时条件才成立。

于 2016-12-23T07:39:04.570 回答
3

在这里,您正在打印与模式匹配的每一行。这正是 的目的grep。由于@Inian 出色地告诉您代码有什么问题,让我提出一个grep基于替代的答案,该答案与命令完全相同awk(尽管速度更快):

grep -E '^[[:digit:]]+,'
于 2016-12-23T08:45:54.473 回答
2

您能否尝试关注并让我知道这是否有帮助。

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]*)$/)  print $0}'

编辑:上面的代码也可以减少一点,如下所示。

echo "123456789012345,3" | awk -F, '($1 ~ /^[[:digit:]]*$/)'
于 2016-12-23T07:42:21.537 回答