Regex 在awk中处理点符号的单词边界
我有一个包含字符串的变量。现在我想在Regex 在awk中处理点符号的单词边界,regex,bash,awk,Regex,Bash,Awk,我有一个包含字符串的变量。现在我想在awk中使用这个变量来设置单词边界。我几乎能做到,但工作边界不适用于dotsign。如何处理这个问题。我必须坚持使用awk,因为我需要根据列采取一些进一步的措施 输入变量: 输入数据: 我得到的是: 期望输出: 当a!=1 sam bla t1.sam sample sam bla sample sam 当a==1 sam bla t1.sam sample sam bla sample sam 点不被视为单词字符,因此在 最好在这里使用平等: awk
awk
中使用这个变量来设置单词边界。我几乎能做到,但工作边界不适用于dot
sign。如何处理这个问题。我必须坚持使用awk
,因为我需要根据列采取一些进一步的措施
输入变量:
输入数据:
我得到的是:
期望输出:
当a!=1
sam bla
t1.sam sample
sam bla
sample sam
当a==1
sam bla
t1.sam sample
sam bla
sample sam
点不被视为单词字符,因此在
最好在这里使用平等:
awk -v test="$x" '$1 == test' file
sam bla
编辑:根据您编辑的问题,您可以使用:
a=1
awk -v a=$a -v test="$x" '(a != 1 && $1 == test) || (a == 1 && $1 ~ test)' file
t1.sam sample
sam bla
sample sam
a=0
awk -v a=$a -v test="$x" '(a != 1 && $1 == test) || (a == 1 && $1 ~ test)' file
sam bla
听起来您想创建一个可选的过滤器,如下所示:
awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
现在,如果shell变量$test
为空,则会打印所有行。否则,仅显示第一个字段等于$test
的行
使用您的文件:
$ test=sam
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
sam bla
$ test=
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
cat foo
t1.sam sample
sam bla
sample sam
我想知道,既然您已经使用了默认的
FS
@Kent,为什么不只使用$1==“sam”或$1==test呢?不使用相等的原因是:有时test=,表示打印1美元包含任何内容的所有行,在等式中,如果只匹配由单词边界包围的一个字符,则这将不起作用。您不是在搜索过度复杂的方式,而是在搜索您的,否则块是多余的-其中$1是某物-$1
始终是“某物”不使用相等的原因是:有时test=。
,意味着打印$1
包含任何内容的所有行,在平等的情况下,这将不起作用。你能在你的问题中用一个例子澄清一下吗?
被认为是一个单词边界,这正是为什么行t1.sample
匹配的原因。对不起,我的意思是,点不被认为是一个单词字符
我添加了一个例子,我想用更短的方式来做。在一个awk
语句中。感谢您的帮助,我不得不稍微调整一下,为我工作。我正要删除我的答案,因为只需在shell中处理一次,然后在else
分支中的cat
文件,就更有意义了。老实说,我不明白您在问题中发布的示例有什么问题。我使用case语句和函数作为它们的选项,因此我必须将逻辑包装在一行中,以便可以将其插入case语句中。我想我没能把这个问题作为一个很好的例子。
awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
$ test=sam
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
sam bla
$ test=
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
cat foo
t1.sam sample
sam bla
sample sam