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

Bash 将两个文件粘贴到第一个文件,bash,file,unix,command-line,concatenation,Bash,File,Unix,Command Line,Concatenation,我们有以下两个文件: t1.txt t2.txt 我可以使用: paste -d"," t1.txt t2.txt > result.txt 并输出result.txt 这很完美,但我想做以下几点: paste -d"," t1.txt t2.txt > t1.txt 我希望t1.txt与result.txt相同,但如下所示,不是我需要的: ,a ,s ,d 我可以将result.txt重命名为t1.txt,但不知是否有更好的方法 注意: 解决方案不必是粘贴,可以是任何东西,

我们有以下两个文件:

t1.txt

t2.txt

我可以使用:

paste -d"," t1.txt t2.txt > result.txt
并输出result.txt

这很完美,但我想做以下几点:

paste -d"," t1.txt t2.txt > t1.txt
我希望t1.txt与result.txt相同,但如下所示,不是我需要的:

,a
,s
,d
我可以将result.txt重命名为t1.txt,但不知是否有更好的方法

注意:

  • 解决方案不必是粘贴,可以是任何东西,只要我们避免创建像result.txt这样的临时文件
  • 实际的t1.txt和t2.txt文件各有160万行
使用海绵
海绵
实用程序就是为此任务创建的:

paste -d, t1.txt t2.txt | sponge t1.txt
spine
moreutils
包的一部分。在类似debian/ubuntu的系统上,运行
apt-get-install-moreutils

使用mktemp 使用临时文件(不带mktemp) 如果无法访问
mktemp
海绵
,可以使用:

paste -d, t1.txt t2.txt > ~/result$$.txt && mv ~/result$$.txt t1.txt
您可以选择将临时文件放在何处。在上面,我们将它放在用户的主目录中,
~/
,因为这样可以避免将文件放在
/tmp
等目录中所产生的安全问题


$
是进程ID。这至少在进程生命周期内是唯一的。

第一个文件消失的原因如下:

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

  • 请参阅bash手册inder中的第3.7.1节,我建议:
    paste-d”、“t1.txt t2.txt>result.txt&&mv result.txt t1.txt
    “只要我们避免创建result.txt这样的临时文件。”这取决于您的意思。因为在处理过程中,新文件和旧文件中的数据必须同时存在。临时结果必须存储在某个地方,无论是内存中还是磁盘上。@John1024好的一点,我想我可以使用临时文件。我担心的是,这将并行运行,因此
    result.txt
    文件应该是特定于运行的,可能使用
    mktemp
    ?@zx8754是否安装在您的系统上?如果没有,通常可以使用:
    paste-d,t1.txt t2.txt>~/result$$$.txt&&mv~/result$$.txt t1.txt
    @John1024请用
    $$
    mktemp
    发布一个答案,同时我会测试回来,谢谢。我恐怕没有安装权限。
    paste -d, t1.txt t2.txt | sponge t1.txt
    
    fname=$(mktemp) && paste -d, t1.txt t2.txt >>"$fname" && mv "$fname" t1.txt
    
    paste -d, t1.txt t2.txt > ~/result$$.txt && mv ~/result$$.txt t1.txt
    
    paste -d"," t1.txt t2.txt > t1.txt