我有一个制表符分隔的文件,其数据如下:
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"
但是只输出了那个列,所以如果我使用这个方法,那么我不知何故需要将其余部分放回去。
如何搜索文件中的列,但返回结果的完整行?
答案 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
传递字段分隔符。