将两个文件粘贴到第一个文件

zx8*_*754 2 unix bash command-line file concatenation

我们有以下两个文件:

t1.txt

1
2
3
Run Code Online (Sandbox Code Playgroud)

t2.txt

a
s
d
Run Code Online (Sandbox Code Playgroud)

我可以用:

paste -d"," t1.txt t2.txt > result.txt
Run Code Online (Sandbox Code Playgroud)

并输出result.txt

1,a
2,s
3,d
Run Code Online (Sandbox Code Playgroud)

哪个是完美的,但我想在下面做:

paste -d"," t1.txt t2.txt > t1.txt
Run Code Online (Sandbox Code Playgroud)

我期待t1.txtresult.txt相同,但它如下所示,而不是我需要的:

,a
,s
,d
Run Code Online (Sandbox Code Playgroud)

我可以将result.txt重命名为t1.txt,但想知道是否有更好的方法?

注意:

  • 解决方案不一定是paste,只要我们避免创建像result.txt这样的临时文件就可以.
  • 实际的t1.txtt2.txt文件各有160万行.

Joh*_*024 5

用海绵

sponge实用程序仅为此任务创建:

paste -d, t1.txt t2.txt | sponge t1.txt
Run Code Online (Sandbox Code Playgroud)

spongemoreutils包的一部分.在debian/ubuntu类系统上运行apt-get install moreutils.

使用mktemp

fname=$(mktemp) && paste -d, t1.txt t2.txt >>"$fname" && mv "$fname" t1.txt
Run Code Online (Sandbox Code Playgroud)

使用临时文件(没有mktemp)

如果一个人没有获得任何一种mktempsponge,可以使用:

paste -d, t1.txt t2.txt > ~/result$$.txt && mv ~/result$$.txt t1.txt
Run Code Online (Sandbox Code Playgroud)

您可以选择放置临时文件的位置.在上面,我们把它放在用户的主目录中~/,因为这可以避免将文件放在目录中的安全问题/tmp.

$$是进程ID.预计至少在该过程的生命周期中这是独特的.