我想在以制表符分隔的.txt文件中搜索模式,如果在一行中找到该模式,则打印该行的第三个字段。
我只需要找到该行中的第一个出现,因为该模式肯定只出现一次。
.txt文件的结构:
XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3
我的第一个想法是,打印"你好"如果找到模式,控制,如果我的代码工作。我还包括了传递给我的bash脚本的变量的回声。
命令行调用和脚本:
$ ./script.sh file.txt foo
#!/bin/bash
file=$1
pattern=$2
awk '/"$pattern"/{print "hello"}' "$file"
echo "$file"
echo "$pattern"
据我发现它为awk,要打印第三个字段,我将不得不替换print" hello"打印" \ $ 2"。
但是打印"你好"已经不起作用了:
实际输出:
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
答案 0 :(得分:2)
我相信你想要的东西:
$ ./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/
以真正使用正则表达式,但我怀疑它会打印第1行和第3行,因为foo
显示在两者中。
如果你想检查你的模式是否存在于该行的任何位置,那么你可以删除$2~
,使其只是'/pattern/{print "hello",$2}
。
答案 1 :(得分:1)
查找
$ x="foo"'bar' && echo "$x"
foobar
$ x="foo" 'bar' && echo "$x"
-bash: bar: command not found
您的脚本是:
awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"
所以猜猜在-v p="$2"
和'$2=="$p"
之间没有留下空格的是什么。是的,它是连接它们所以不要这样做 - 添加一个空格:
awk -v p="$2" '$2=="$p"{print "hello",$3}' "$1"
意外的.
btw是您的文件名.
中的file.txt
,当awk尝试将字符串file.txt
评估为由于连接消耗实际情况而导致其崩溃时脚本分配到p
。
现在要在比较中实际使用变量p
,你必须将它用作变量,而不是将其放在字符串中:
awk -v p="$2" '$2==p{print "hello",$3}' "$1"
以上简单回答了有关语法错误的问题。要实际做你想要的东西需要其中一个,这取决于你是否想要一个字符串或正则表达式匹配,以及你是否想要部分或完全匹配:
awk -v p="$2" '$2==p{print "hello",$3}' "$1"
awk -v p="$2" '$2~p{print "hello",$3}' "$1"
awk -v p="$2" '$2~"\\<"p"\\>"{print "hello",$3}' "$1"
或其他一些解决方案,具体取决于您迄今未说明的要求。