3

我有一个如下所示的 CSV 文件:

A,B,C
1,2,3
4,4,4
1,2,6
3,6,9

有没有一种简单的方法可以对 B 列为 2 的所有行进行 grep,并保留标题?例如,我希望输出像

A,B,C
1,2,3
1,2,6

我在linux下工作

4

3 回答 3

5

使用 awk:

awk -F, 'NR==1 || $2==2' file

NR==1 -> 如果第一行,$2==2 -> 如果第二列等于 2。如果以上任何一个为真,则打印行。

要使用标题列名称选择列:

awk -F, -v col="B" 'NR==1{for(i=1;i<=NF;i++)if($i==col)break;print;next}$i==2'  file

将 B 替换为要检查的列的适当名称。

于 2012-10-25T16:01:07.290 回答
2

您可以使用以下地址sed

sed -n '1p;/^[^,]*,2/p'

它的意思是:

1p        Print the first line.
/         Start a match.
    ^     Match the beginnning of a line.
    [^,]  Match anything but a comma
    *     zero or more times.
    ,     Match a comma.
    2     Match a 2.
/p        End of match, if it matches, print.

如果标头可以包含您要查找的值,则应更加小心:

sed -n '1p;1!{/^[^,]*,2/p}'

1!{ ... }仅表示“对除第一行以外的行执行以下操作”。

对于列号n>2,您可以添加一个量词:

sed -n '1p;1!{/^\([^,]*,\)\{M\}2/p}'

哪里M=n-1。量词只是意味着重复,所以非逗号 0 或更多次逗号的东西被重复 M 次。

对于值可以包含逗号的真正 CSV 文件,切换到 Perl 和Text::CSV

于 2012-10-25T15:55:50.183 回答
1
$ awk -F, 'NR==1 { for (i=1;i<=NF;i++) h[$i] = i; print; next } $h["B"] == 2' file
A,B,C
1,2,3
1,2,6

顺便说一句,sed 是在单行上进行简单替换的出色工具,对于其他任何事情,只需使用 awk - 如果需要,将来代码会更清晰并且更容易增强。

于 2012-10-25T16:55:47.237 回答