我想将一个文本文件的标题与另一个文本文件组合在一起。我知道我可以用
做到这一点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)
不是文件,因此无法连接。
由于
答案 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
我认为这是你在寻找的。 p>
答案 3 :(得分:0)
这个问题的所有其他三个答案都是好的,并且由于每个答案都以不同的方式回答,因此学习每一个答案都是一个很好的练习。 LC-datascientist和Diego的回答每个都会产生一个子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