我无法获取将在指定列中搜索输入项的正则表达式。如果在该列中找到该术语,则需要输出整行。 这些是我的变量:
sreg = search word #Example: Adam
file = text file #Example: Contacts.txt
sfield = column number #Example: 1
文本文件采用这种格式,空格为字段分隔符,有许多联系人条目:
First Last Email Phone Category
Adam aster junfmr@ 8473847548 word
Jeff Williams 43wadsfddf@ 940342221995 friend
JOhn smart qwer@qwer 999999393 enemy
yooun yeall adada 111223123 other
zefir sentr jjdirutk@jd 8847394578 other
我尝试过没有成功:
grep "$sreg" "$file" | cut -d " " -f"$sfield"-"$sfield"
awk -F, '{ if ($sreg == $sfield) print $0 }' "$file"
awk -v s="$sreg" -v c="$sfield" '$c == s { print $0 }' "$file"
感谢您的帮助!
答案 0 :(得分:4)
awk
可能是最佳解决方案:
awk -v field="$field" -v name="$name" '$field==name' "$file"
检查字段编号$field
是否具有值$name
。如果是这样,awk
会自动打印包含它的整行。
例如:
$ field=1
$ name="Adam"
$ file="your_file"
$ awk -v field="$field" -v name="$name" '$field==name' "$file"
Adam aster junfmr@ 8473847548 word
如您所见,我们使用-v var="$bash_var"
提供参数,以便您可以在awk
中使用它们。
此外,空格是字段分隔符,因此您不需要指定它,因为它是默认值。
答案 1 :(得分:1)
这对我有用:
awk -v f="$sfield" -v reg="$sreg" '{if ($f ~ reg) {print $0}}' "$file"
主要问题是你需要从$ sfield(ex,“1”)到$($ sfield)(ex,$ 1)的间接。
我尝试使用backtricks`,并且还使用$ {!sfield},但它们在awk中不起作用,因为awk不接受这个。最后我找到了将变量传递给awk的方法,转换为awk内部变量(使用-v)。
在awk中,我发现你甚至无法访问外部的变量。所以我也必须通过$ sreg。
更新:我认为使用“〜”代替“==”更好,因为原始要求说matchi == ng一个正则表达式。
例如, SREG =广告