搜索文件,显示匹配和第一行

时间:2012-02-24 07:33:28

标签: bash unix sed awk grep

我有一个逗号分隔的文本文件,其中包含第一行中的列标题:

column1;column2;colum3
foo;123;345
bar;345;23
baz;089;09

现在我想要一个输出第一行和匹配行的命令。是否有一个比以下更短的方式:

head -n 1 file ; cat file | grep bar

6 个答案:

答案 0 :(得分:6)

这应该做的工作:

sed -n '1p;2,${/bar/p}' file

其中:

  • 1p将打印第一行
  • 2,$将从第二行到最后一行匹配
  • /bar/p将打印与bar
  • 匹配的行

请注意,如果列名称匹配,则不会两次打印标题行。

答案 1 :(得分:3)

您可以使用grouping commands,然后通过管道发送到column命令进行漂亮打印

$ { head -1; grep bar; } <input.txt | column -ts';'
column1  column2  colum3
bar      345      23

答案 2 :(得分:3)

如果第一行也包含bar怎么办?然后用你的版本打印两次。 awk解决方案:

awk 'NR == 1 { print } NR > 1 && $0 ~ "bar" { print }' FILE

如果你想将搜索sting作为该行的最后一项:

awk 'ARGIND > 1 { exit } NR == 1 { print } NR > 1 && $0 ~ ARGV[2] { print }' FILE YOURSEARCHSTRING 2>/dev/null

sed解决方案:

sed -n '1p;1d;/bar/p' FILE

这两者的优势在于,这是一个单一的过程。

答案 3 :(得分:3)

这可能对您有用:

cat file | awk 'NR<2;$0~v' v=baz
column1;column2;colum3
baz;089;09

通常cat file | ...没用,但在这种情况下,它会使文件参数保持不变,并允许快速修改变量v

另一种解决方案:

cat file | sed -n '1p;/foo/p' 
column1;column2;colum3
foo;123;345

答案 4 :(得分:2)

head -n 1 file && grep bar file也许有更短的版本,但会有点复杂。

编辑:根据bobah的评论,我添加了&amp;&amp;在命令之间只有一个错误的遗失文件

答案 5 :(得分:1)

这是最短的命令:

awk 'NR==1||/bar/' file