Linux bash脚本:如何搜索列但返回完整行?

时间:2014-11-23 21:40:44

标签: linux bash

我有一个制表符分隔的文件,其数据如下:

col1    col2    col3

我编写了一个bash脚本,允许使用以下代码搜索文件:

echo -en "Search term: "
read search

data=`cat data.data | egrep -i "$search"`

这适用于搜索整个文件,但我现在只想搜索特定列(用户可以选择)。

我知道cut命令,可以使用以下方法搜索列:

cat data.data | cut -f$col | egrep -i "$search"

但是只输出了那个列,所以如果我使用这个方法,那么我不知何故需要将其余部分放回去。

如何搜索文件中的列,但返回结果的完整行?

2 个答案:

答案 0 :(得分:3)

您可以将两个变量传递给awk:列号和搜索词。

awk -vcol="$col" -vsearch="$search" '$col ~ search' data.data

如果$col的值为2,则awk中的$2将对应于第二列。 ~运算符用于执行正则表达式模式匹配。如果列与正则表达式匹配,则将打印该行。

测试出来:

$ cat data.data
col1    col2    col3
$ col=2
$ search=l2
$ awk -vcol="$col" -vsearch="$search" '$col ~ search' data.data
col1    col2    col3
$ search=l3
$ awk -vcol="$col" -vsearch="$search" '$col ~ search' data.data
# no output

如果要进行不区分大小写的模式匹配,则有两个选项:将所有内容转换为大写或小写(tolower($col) ~ tolower(search)),或者如果使用的是GNU awk,请设置IGNORECASE变量:

$ search=L2
$ awk -vIGNORECASE=1 -vcol="$col" -vsearch="$search" '$col ~ search' data.data
col1    col2    col3

答案 1 :(得分:1)

awk更容易:

data=$(awk -v col=$col -v term="$term" 'toupper($col)==toupper(term)' file)

col - 列号
术语 - 搜索词

如果需要,您还可以使用-F传递字段分隔符。