我有一个包含多列数据的大型文本文件。我正在尝试编写一个脚本,该脚本从命令行接受列号和关键字,并在显示任何匹配项的整行之前搜索任何匹配项。
我一直在尝试以下方式:
grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'
但这根本行不通。我在正确的路线上吗?谢谢你的帮助!
-v 选项可用于将 shell 变量传递给awk
命令。
以下可能是您正在寻找的内容:
awk -v s=$SEARCH -v c=$COLUMN '$c == s { print $0 }' file.txt
编辑:
我一直在尝试编写更优雅、更紧凑的代码。所以这就是丹尼斯的意思:
awk -v s="$search" -v c="$column" '$c == s { print $0 }' file.txt
看起来很合理。尝试使用set -x
来查看传递给awk
. 您还可以使用不同的和/或更多的 awk 东西,包括摆脱单独的 grep:
awk -v colnum=$columnNumber -v require="$searchTerm"
"/$fileName/ { if (\$colnum == require) print }"
它通过设置 awk 变量(在这种情况下为colnum
and require
)然后使用文字字符串$colnum
来获取所需的字段,并使用变量require
来获取所需的字符串。
请注意,在所有情况下(使用或不使用grep
命令),任何正则表达式元字符都$fileName
将是 meta-y,例如,this.that
将匹配名为this.that
的文件以及名为的文件thisXthat
。