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

3

我有一个制表符分隔的文件,格式如下:

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"

但是只有该列被输出,如果我使用这种方法,则需要以某种方式获取其余行。如何在文件中搜索列,但返回结果的完整行?

是否仅限于使用严格的bash(使用数组),还是也可以使用像awk这样的工具? - Fredrik Pihl
@FredrikPihl 只要在bash脚本中使用,任何东西都可以被使用。我开始查看awk,但它似乎更适合替换操作,就像sed一样。 - Nate
2个回答

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

你还需要使用 toupper()tolower() 处理大小写不敏感的情况。 - P.P
不错,我建议了一种处理大小写敏感的替代方法。 - Tom Fenech

1

awk更适合这个:

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

col - 列数
term - 搜索词

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


这将会寻找精确匹配,而不是像 grep 一样的部分匹配,对吗? - Nate
1
是的。如果你想要像grep一样匹配,你可以使用正则表达式匹配符号~代替==data=$(awk -v col=$col -v term="$term" 'toupper($col) ~ toupper(term)' file) - P.P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接