将两个文件粘贴到第一个文件[重复]

问题描述 投票:2回答:2

这个问题在这里已有答案:

我们有以下两个文件:

t1.txt

1
2
3

t2.txt

a
s
d

我可以用:

paste -d"," t1.txt t2.txt > result.txt

并输出result.txt

1,a
2,s
3,d

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

paste -d"," t1.txt t2.txt > t1.txt

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

,a
,s
,d

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

注意:

  • 解决方案不一定是paste,可以是任何东西,只要我们避免创建像result.txt这样的临时文件。
  • 实际的t1.txt和t2.txt文件各有160万行。
bash file unix command-line concatenation
2个回答
5
投票

Using sponge

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

paste -d, t1.txt t2.txt | sponge t1.txt

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

Using mktemp

fname=$(mktemp) && paste -d, t1.txt t2.txt >>"$fname" && mv "$fname" t1.txt

Using a temporary file (without mktemp)

如果一个人无法访问mktempsponge,可以使用:

paste -d, t1.txt t2.txt > ~/result$$.txt && mv ~/result$$.txt t1.txt

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

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


3
投票

第一个文件消失的原因是:

paste -d"," t1.txt t2.txt > t1.txt
  1. shell首先处理重定向,截断“t1”文件以准备接收数据。该文件现在为空
  2. 现在,shell使用一个空文件调用该命令。

请参阅bash手册inder https://www.gnu.org/software/bash/manual/bash.html#Executing-Commands中的第3.7.1节

© www.soinside.com 2019 - 2024. All rights reserved.