使用命令行合并文件的 non-adjacent 个部分

Using the command line to combine non-adjacent sections of a file

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

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

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

我想 select 从第 2 行到 N 所有包含 "CA" 的行使用 grep 并将第一行,变量名放在第一行使用 GNU/Linux 命令的输出文件。

该示例所需的输出为:

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

我可以 select 使用以下代码行得到两组所需的输出。

head -1 filename
grep -E CA filename

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

如果您 运行 从 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

不清楚您在寻找什么,但也许只是:

{ 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'

我刚发现一个使用 cat 命令的方法。

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

此站点 tldp.org 调用 <(command) 语法 "process substitution."

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