Bash 将两个文件粘贴到第一个文件
我们有以下两个文件: t1.txt t2.txt 我可以使用: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,但不知是否有更好的方法 注意: 解决方案不必是粘贴,可以是任何东西,
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
请参阅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