【发布时间】:2014-03-13 12:37:06
【问题描述】:
假设我有一个制表符分隔的 csv 文件,如下所示:
a b c
d e f
g h i
使用命令行实用程序,有没有一种方法可以返回与所需 grep 模式匹配的整个列,或者在上面的示例中,我想返回第二列以获取 b 的 grep?
【问题讨论】:
标签: regex linux csv command-line grep
假设我有一个制表符分隔的 csv 文件,如下所示:
a b c
d e f
g h i
使用命令行实用程序,有没有一种方法可以返回与所需 grep 模式匹配的整个列,或者在上面的示例中,我想返回第二列以获取 b 的 grep?
【问题讨论】:
标签: regex linux csv command-line 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 是正则表达式,您可以将 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
【讨论】:
如果只有一个匹配,你可以这样做:
$ awk -v patt="b" 'FNR==NR {for (i=1;i<=NF;i++) $i~patt && col=i; next} {print $col}' file file
b
e
h
它在文件中循环两次。首先获取匹配文本的列号。其次是打印该特定列。
-v patt="b"给模式FNR==NR {for (i=1;i<=NF;i++) $i~patt && col=i; next} 在第一次读取时,循环遍历字段并检查模式是否匹配。如果是这样,请将列号存储在 col 变量中。{print $col} 打印所有行的特定列。【讨论】:
您确实需要提示您的文件有多大,您希望多久运行一次,以及您有多少列。但是
根据以上观察,我会
【讨论】: