我想在制表符分隔的 .txt 文件中搜索模式,如果在一行中找到该模式,则打印该行的第三个字段。
我只需要找到该行中的第一次出现,因为该模式肯定只出现一次。
.txt 文件的结构:
XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3
我的第一个想法是,如果找到模式,打印“hello”,控制我的代码是否有效。我还包含了我传递给 bash 脚本的变量的 echo 。
命令行调用和脚本:
$ ./script.sh file.txt foo
#!/bin/bash
file=$1
pattern=$2
awk '/"$pattern"/{print "hello"}' "$file"
echo "$file"
echo "$pattern"
就我在 awk 中找到的而言,要打印第三个字段,我必须将打印“hello”替换为打印“\$2”。
但是打印“hello”已经行不通了:
实际输出:
file.txt
foo
期望的输出:
hello (respectively target1)
file.txt
foo
而且我还确定,“foo”在 file.txt 中
进度(请查看评论和回答):
#!/bin/bash
awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"
echo "$1"
echo "$2"
新输出:
awk: 1:unexpected character '.'
file.txt
foo
最佳答案
我相信你想要这样的东西:
$ ./script.sh file.txt foo
#!/bin/bash
file=$1
pattern=$2
awk -v pattern=$pattern'$2==pattern{print "hello",$3}' "$file"
echo "$file"
echo "$pattern"
这里我们摆脱了循环,因为 awk
在输入文件时检查每条记录。我们还使用 -v
标志将 $pattern
变量传递到 awk
脚本中。然后我们检查第二个字段 $2
是否为 pattern
并打印 "hello"
以及第三个字段 $3< 的内容
.
如果需要,您可以将 awk
条件更改为 $2~/pattern/
以真正利用正则表达式,但我怀疑它会将第一行和第三行打印为 foo
出现在两者中。
如果你想检查你的模式是否存在于行中的任何地方,那么你可以删除 $2~
所以它只是 '/pattern/{print "hello",$2}
.
关于linux - 如果找到模式,如何使用 awk 打印 "hello",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46983041/