Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux CSV grep,但保留标题_Linux_Csv_Awk_Grep - Fatal编程技术网

Linux CSV grep,但保留标题

Linux CSV grep,但保留标题,linux,csv,awk,grep,Linux,Csv,Awk,Grep,我有一个CSV文件,如下所示: A,B,C 1,2,3 4,4,4 1,2,6 3,6,9 有没有一种简单的方法可以grep所有B列为2的行,并保留标题?例如,我希望输出如下 A,B,C 1,2,3 1,2,6 我在linux下工作您可以在sed中使用地址: sed -n '1p;/^[^,]*,2/p' 这意味着: 1p打印第一行。 /开始比赛。 ^匹配一行的开头。 [^,]匹配除逗号以外的任何内容 *零次或多次。 ,匹配一个逗号。 2与a 2匹配。 /p匹配结束,如果匹配,则打印。

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

A,B,C
1,2,3
4,4,4
1,2,6
3,6,9
有没有一种简单的方法可以grep所有B列为2的行,并保留标题?例如,我希望输出如下

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

我在linux下工作

您可以在
sed
中使用地址:

sed -n '1p;/^[^,]*,2/p'
这意味着:

1p打印第一行。
/开始比赛。
^匹配一行的开头。
[^,]匹配除逗号以外的任何内容
*零次或多次。
,匹配一个逗号。
2与a 2匹配。
/p匹配结束,如果匹配,则打印。
如果标题可以包含要查找的值,则应更加小心:

sed -n '1p;1!{/^[^,]*,2/p}'
1!{…}
的意思是“对第一行以外的行执行以下操作”

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

sed -n '1p;1!{/^\([^,]*,\)\{M\}2/p}'
其中
M=n-1
。量词只是表示重复,所以非逗号-0-或更多次-逗号的东西重复了M次

对于值可以包含逗号的真正CSV文件,请使用awk切换到Perl和。

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

awk-F,-v col=“B”'NR==1{for(i=1;i
awk-F,'NR==1{for(i=1;ithanks choroba,但是你能帮我翻译一下吗?我只是看到了很多奇怪的字符,但不知道它们的意思。谢谢大师,但是有没有办法用标题列名替换$2?我的CSV有很多列,所以很难计算……@CodeNoob:更新了上面的解决方案。
$ 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