我有一个包含字符串的变量。现在我想在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
答案 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