-1

是否可以使用过滤器将文件中的标题行与过滤器的输出连接起来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 行中选择所有包含“CA”grep的行,并使用 GNU/Linux 命令将第一行(变量名)放在输出文件的第一行中。

该示例所需的输出将是:

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

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

head -1 filename
grep -E CA filename

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

4

3 回答 3

2

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

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

第一行将覆盖输出文件,因为使用了单个 >。第二行将附加到输出文件,因为使用了 >>。

如果您想在单个命令中执行此操作,则以下内容在 bash 中有效:

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

如果您希望输出转到标准输出,请省略括号和重定向:

head -1 filename && grep -E CA filename
于 2015-05-13T17:38:53.457 回答
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'
于 2015-05-14T14:48:56.610 回答
0

我刚刚遇到了一种使用该cat命令的方法。

cat <(head -1 filename) <(grep -E CA filename) > outputfile

该站点tldp.org<(command)语法称为“进程替换”。

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

于 2015-05-15T18:29:20.453 回答