4

我有一个包含多列数据的大型文本文件。我正在尝试编写一个脚本,该脚本从命令行接受列号和关键字,并在显示任何匹配项的整行之前搜索任何匹配项。

我一直在尝试以下方式:

grep $fileName | awk '{if ($'$columnNumber' == '$searchTerm') print $0;}'

但这根本行不通。我在正确的路线上吗?谢谢你的帮助!

4

2 回答 2

2

-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

于 2012-04-29T23:27:43.210 回答
0

看起来很合理。尝试使用set -x来查看传递给awk. 您还可以使用不同的和/或更多的 awk 东西,包括摆脱单独的 grep:

awk -v colnum=$columnNumber -v require="$searchTerm"
    "/$fileName/ { if (\$colnum == require) print }"

它通过设置 awk 变量(在这种情况下为colnumand require)然后使用文字字符串$colnum来获取所需的字段,并使用变量require来获取所需的字符串。

请注意,在所有情况下(使用或不使用grep命令),任何正则表达式元字符都$fileName将是 meta-y,例如,this.that将匹配名为this.that的文件以及名为的文件thisXthat

于 2012-04-29T23:27:29.073 回答