这个问题在这里已有答案:
我们有以下两个文件:
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这样的临时文件。sponge
实用程序是为此任务创建的:
paste -d, t1.txt t2.txt | sponge t1.txt
sponge
是moreutils
包的一部分。在debian / ubuntu类系统上,运行apt-get install moreutils
。
fname=$(mktemp) && paste -d, t1.txt t2.txt >>"$fname" && mv "$fname" t1.txt
如果一个人无法访问mktemp
或sponge
,可以使用:
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 https://www.gnu.org/software/bash/manual/bash.html#Executing-Commands中的第3.7.1节