使用命令行合并文件的 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."
我不清楚哪种方法在内存/速度方面更有效,但这是可以测试的。
是否可以将文件中的 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."
我不清楚哪种方法在内存/速度方面更有效,但这是可以测试的。