我有一个逗号分隔的文本文件,其中包含第一行中的列标题:
column1;column2;colum3
foo;123;345
bar;345;23
baz;089;09
现在我想要一个输出第一行和匹配行的短命令。是否有一个比以下更短的方式:
head -n 1 file ; cat file | grep bar
答案 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
也许有更短的版本,但会有点复杂。
答案 5 :(得分:1)
这是最短的命令:
awk 'NR==1||/bar/' file