是否有简单的单行方法将unix命令的输出与文件组合?

时间:2016-07-06 20:38:24

标签: shell unix merge command cat

我想将一个文本文件的标题与另一个文本文件组合在一起。我知道我可以用

做到这一点
head -n1 file1.txt > header.txt
cat header.txt file2.txt > file2_withHeader.txt

但是这会生成一个不必要的中间文件,这是两个步骤。有没有办法让它一步而不生成中间文件?

我在想这个

cat $(head -n1 file1.txt) file2.txt > file2_withHeader.txt

但它不起作用,因为$(head -n1 file1.txt)不是文件,因此无法连接。

由于

4 个答案:

答案 0 :(得分:0)

您实际上可以附加重定向:

head -n1 file1.txt > result.txt
cat file2.txt >> result.txt

答案 1 :(得分:0)

谢谢你,λuser。这也是我可以做的一个选择。

实际上,我只想出了我希望的单线。

(head -n1 file1.txt; cat file2.txt) > file2_withHeader.txt

很抱歉,我意识到这与其他人要求在unix中组合两个命令的问题相同,所以实际上已经回答了这个问题。

答案 2 :(得分:0)

bash你也可以

cat <(head -n 1 file1.txt) file2.txt > file2_withHeader.txt

我认为这是你在寻找的。

答案 3 :(得分:0)

这个问题的所有其他三个答案都是好的,并且由于每个答案都以不同的方式回答,因此学习每一个答案都是一个很好的练习。 LC-datascientistDiego的回答每个都会产生一个子shell,所以λuser的两行方法,也许是两个命令之间的&&,是最理想的

如果你真的想在一个不启动子shell的命令中使用它,你可以使用awk(mawk):

awk 'BEGIN { getline < file1.txt; print } 1' file2.txt
由于gawk命令,

nextfile可以做得更优雅:

gawk '1; NR == FNR { nextfile }' file1.txt file2.txt

这些做同样的事情:file1.txt的第一行并打印出来,然后打印整个file2.txt。

mawk代码使用getline从给定输入读取单行到$0(在本例中;参见手册页),我们可以在读取file2之前执行此操作。文本。 1为真,因此第二个子句始终触发,触发默认操作(print $0)。

首先打印gawk代码,然后使用NR == FNR确定您正在查看第一个文件(记录(行)的总数和当前文件的记录数相同),在这种情况下,已经有时间转移到第二个文件。

对于前三行,mawk需要一个循环:

awk 'BEGIN { for (i=0;i<3;i++) { getline < file1.txt; print } } 1' file2.txt

gawk只需要另一个条件:

gawk '1; NR == FNR && NR >= 3 { nextfile }' file1.txt file2.txt