使用命令行组合文件的非相邻部分

时间:2015-05-13 12:43:24

标签: linux grep cat gnu-coreutils

是否可以使用grep将文件中的标题行与过滤器的输出连接起来?也许使用cat命令或GNU的coreutils中的其他东西?

特别是,我有一个制表符分隔文件,大致如下所示:

var1   var2   var3
1      MT     500
30     CA     40000
10     NV     1240   
40     TX     500   
30     UT     35000
10     AZ     1405
35     CO     500
15     UT     9000
1      NV     1505
30     CA     40000
10     NV     1240

我想从第2行 - N中选择使用grep包含“CA”的所有行,并使用GNU / Linux将第一行(变量名称)放在输出文件的第一行中命令。

示例的所需输出为:

var1   var2   var3
30     CA     40000
35     CA     65000
15     CA     2500

我可以使用以下代码行选择两组所需的输出。

head -1 filename
grep -E CA filename

我最初的想法是使用cat组合这些命令的输出,但到目前为止我还没有成功。

3 个答案:

答案 0 :(得分:2)

如果您正在运行shell中的命令(包括shell脚本),则可以单独运行每个命令并重定向输出:

head -1 filename > outputfile
grep -E CA filename >> outputfile

第一行将覆盖outputfile,因为单个>被使用了。第二行将附加到outputfile,因为>>用了。

如果你想在一个命令中执行此操作,以下工作在bash:

(head -1 filename && grep -E CA filename) > outputfile

如果您希望输出转到标准输出,请不要使用括号和重定向:

head -1 filename && grep -E CA filename

答案 1 :(得分:1)

目前尚不清楚你在寻找什么,但也许只是:

{ head -1 filename; grep -E CA filename; } > output

awk 'NR==1 || /CA/' filename > output

但是对你的问题的另一种解释最好使用sed或awk来解决。 例如,要打印第5-9行和第14行,您可以执行以下操作:

sed -n -e 5,9p -e 14p

awk '(NR >=5 && NR <=9) || NR==14'

答案 2 :(得分:0)

我刚遇到一个使用cat <(head -1 filename) <(grep -E CA filename) > outputfile 命令的方法。

<(command)

此网站tldp.org调用{{1}}语法&#34;流程替换。&#34;

我不清楚哪种方法在内存/速度方面更有效,但这是可以测试的。