在awk中处理点符号的单词边界

时间:2017-04-11 07:38:32

标签: regex bash awk

我有一个包含字符串的变量。现在我想在awk中使用此变量来放置单词边界。我几乎能够做到,但工作边界不适用于dot符号。如何处理这个问题。我必须坚持使用awk,因为我有一些基于列的进一步操作。

输入变量:

echo $x
sam

输入数据:

cat foo
t1.sam sample
sam bla
sample sam

我得到的是什么:

awk -v test="$x" '$1~"\\<"test"\\>"' foo
t1.sam sample
sam bla

grep -w提供了所需的结果,但无法使用,grep '\<sam\>' foo也有效。但同一regex无效awk

添加了示例:if a != 1然后打印所有行。 if a=1然后检查$1是否包含sam(带边界),如果是,则打印所有行。

a=1;
x=sam;

if [ $a -eq 1 ];then

    awk -v test="$x" '$1 == test' foo #Print all the lines where $1 is sam. 

 else

    awk -v test="$x" '$1 ~ /./' foo #print all the lines where $1 is something. 


fi

期望的输出:

a != 1

sam bla

a == 1

t1.sam sample
sam bla
sample sam

2 个答案:

答案 0 :(得分:1)

DOT不被视为单词字符,因此边界断言在.之后无效

最好在这里使用相等:

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

答案 1 :(得分:1)

听起来你想要创建一个可选的过滤器,如下所示:

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