假设我有一个标签分隔的csv文件,如下所示:

a b c
d e f
g h i

使用命令行实用程序,是否可以返回与所需grep模式匹配的整个列,或者在上面的示例中,我想返回b的grep的第二列?

最佳答案

 awk -F'\t' -v pat="b" 'NR==FNR{for(i=1;i<=NF;i++)if($i~pat)c[i];next}
                        {s="";for(i=1;i<=NF;i++)
                         if(i in c)s=s sprintf("%s\t", $i);
                         sub(/\t$/,"",s);print s}' file file

这条线起作用。
它将打印与您的pat匹配的任何列,并保持column格式。
pat是regex,您可以将shell变量传递给awk行
输出遵循原始列顺序
看一看这个例子:(我在您的第3列中添加了一个b来显示多个匹配的案例):
kent$  cat f
a       b       c
d       e       b
g       h       i

kent$  awk -F'\t' -v pat="b" 'NR==FNR{for(i=1;i<=NF;i++)if($i~pat)c[i];next}{s="";for(i=1;i<=NF;i++)if(i in c)s=s sprintf("%s\t", $i);sub(/\t$/,"",s);print s}' f f
b       c
e       b
h       i

10-08 02:04