是否有一种简单的 one-line 方法可以将 unix 命令的输出与文件结合起来?
Is there a simple one-line approach to combine the output of an unix command with a file?
我想将一个文本文件的 header 与另一个文本文件合并。我知道我可以做到
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)
不是文件,因此无法连接。
谢谢
您实际上可以附加重定向:
head -n1 file1.txt > result.txt
cat file2.txt >> result.txt
谢谢你,λuser。这也是我可以做的一种选择。
其实,我只是找到了我想要的单行线。
(head -n1 file1.txt; cat file2.txt) > file2_withHeader.txt
抱歉,我意识到这与其他人要求在 unix 中组合两个命令的问题相同,因此实际上已经回答了。
在bash
你也可以做
cat <(head -n 1 file1.txt) file2.txt > file2_withHeader.txt
我想这正是您要找的。
这个问题的所有其他三个答案都很好,并且由于每个答案都以不同的方式回答,因此学习每个答案都是一个很好的练习。 's and 's answer each spawn a subshell, so 的两行方法,也许在两个命令之间加上 &&
,是最理想的。
如果你真的想在一个不启动子shell的命令中使用它,你可以使用awk
(mawk):
awk 'BEGIN { getline < file1.txt; print } 1' file2.txt
由于 nextfile
命令,gawk
可以做得更优雅:
gawk '1; NR == FNR { nextfile }' file1.txt file2.txt
它们做同样的事情:file1.txt 的第一行并打印它,然后打印整个 file2.txt.
mawk
代码使用 getline
将给定输入中的一行读入 [=20=]
(在本例中;参见手册页),我们可以在阅读之前这样做file2.txt。 1
为真,因此第二个子句总是触发,触发默认操作 (print [=22=]
)。
先打印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
我想将一个文本文件的 header 与另一个文本文件合并。我知道我可以做到
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)
不是文件,因此无法连接。
谢谢
您实际上可以附加重定向:
head -n1 file1.txt > result.txt
cat file2.txt >> result.txt
谢谢你,λuser。这也是我可以做的一种选择。
其实,我只是找到了我想要的单行线。
(head -n1 file1.txt; cat file2.txt) > file2_withHeader.txt
抱歉,我意识到这与其他人要求在 unix 中组合两个命令的问题相同,因此实际上已经回答了。
在bash
你也可以做
cat <(head -n 1 file1.txt) file2.txt > file2_withHeader.txt
我想这正是您要找的。
这个问题的所有其他三个答案都很好,并且由于每个答案都以不同的方式回答,因此学习每个答案都是一个很好的练习。 &&
,是最理想的。
如果你真的想在一个不启动子shell的命令中使用它,你可以使用awk
(mawk):
awk 'BEGIN { getline < file1.txt; print } 1' file2.txt
由于 nextfile
命令,gawk
可以做得更优雅:
gawk '1; NR == FNR { nextfile }' file1.txt file2.txt
它们做同样的事情:file1.txt 的第一行并打印它,然后打印整个 file2.txt.
mawk
代码使用 getline
将给定输入中的一行读入 [=20=]
(在本例中;参见手册页),我们可以在阅读之前这样做file2.txt。 1
为真,因此第二个子句总是触发,触发默认操作 (print [=22=]
)。
先打印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