awk '$1 ~

问题描述 投票:0回答:2

我试图选择一个有一定数量逗号的字段。例如,我可以在一个字段中选择1个逗号,如下所示。

$ echo jkl,abc | awk '$1 ~ /[a-z],[a-z]/{print $0}'
jkl,abc

预期的输出是 "jkl,abc", 可以看到.

然而,当我尝试选择2个逗号时,却没有成功。

$ echo jkl,abc,xyz | awk '$1 ~ /[a-z],[a-z],[a-z]/{print $0}'
(no output)

有什么想法吗?

谢谢!我想在字段中选择一个逗号。

regex awk
2个回答
2
投票

应该是这样的。

echo jkl,abc,xyz | awk '/[a-z]+,[a-z]+,[a-z]+/{print $0}'

或者...

echo jkl,abc,xyz | awk '/[a-z]+,[a-z]+,[a-z]+/'

OP的代码为什么不能用。

因为上位机只提到了一个出现的 [a-z], 但不是这样的,在逗号前有超过1个字符,因此它不匹配。用你给的代码 $1 不需要,因为你是整行匹配,所以我去掉了 $1 部分的解决方案。

如果你有多个字段(用空格隔开),并且你想检查第一部分的条件,那么你可以使用:

echo "jkl,abc,xyz blabla" | awk '$1 ~ /[a-z]+,[a-z]+,[a-z]+/'

1
投票

/[a-z],[a-z],[a-z]/ doesn't match jkl,abc,xyz 因为你没有使用量化符。正确的regex应该是。/^[a-z]+,[a-z]+,[a-z]+$/ 例如:

awk '/^[a-z]+,[a-z]+,[a-z]+$/' <<< 'jkl,abc,xyz'

然而,为了验证逗号的数量,最好是在比较字段数量的同时使用 FS = "," 像这样。

awk -F, 'NF == 2' <<< 'jkl,abc'
awk -F, 'NF == 3' <<< 'jkl,abc,xyz'

jkl,abc
jkl,abc,xyz

1
投票

你的regexp的中间部分并不包含逗号之间的一个以上的字母 所以你应该只包含这一部分 [a-z]*[a-z]+ 取决于你对处理零字母情况的要求。

在一个字段中找到2个或更多逗号的一些方法可以考虑。

$ echo jkl,abc,xyz | awk '$1 ~ /[a-z],[a-z]*,[a-z]/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk '$1 ~ /([a-z]*,){2,}/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk '$1 ~ /[^,],[^,]*,[^,]/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk '$1 ~ /([^,]*,){2,}/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk 'gsub(/,/,"&",$1) > 1'
jkl,abc,xyz
© www.soinside.com 2019 - 2024. All rights reserved.