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

时间:2017-12-19 23:12:25

标签: bash file unix command-line concatenation

我们有以下两个文件:

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万行。

2 个答案:

答案 0 :(得分:5)

使用海绵

print(len(accountListBox.all_selected_options)) 实用程序仅为此任务创建:

sponge

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

使用mktemp

apt-get install moreutils

使用临时文件(不含mktemp)

如果一个人无法访问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。预计至少在整个过程的生命周期中这是独一无二的。

答案 1 :(得分:3)

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

schema-request
  1. shell首先处理重定向,截断“t1”文件以准备接收数据。 该文件现在为空
  2. 现在shell调用带有一个空文件的命令。
  3. 请参阅bash手册inder https://www.gnu.org/software/bash/manual/bash.html#Executing-Commands

    中的第3.7.1节