【问题标题】:Paste two files to the first file [duplicate]将两个文件粘贴到第一个文件[重复]
【发布时间】:2017-12-19 23:12:25
【问题描述】:

我们有以下两个文件:

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.txtresult.txt 相同,但它如下所示,而不是我需要的:

,a
,s
,d

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

注意:

  • 解决方案不一定是paste,只要我们避免创建像 result.txt 这样的临时文件,可以是任何解决方案。
  • 实际的 t1.txtt2.txt 文件各有 160 万行。

【问题讨论】:

  • 我建议:paste -d"," t1.txt t2.txt > result.txt && mv result.txt t1.txt
  • “只要我们避免创建像 result.txt 这样的临时文件。” 这取决于你的意思。由于新旧文件中的数据在处理过程中必须同时存在。临时结果必须存储在某个地方,无论是在内存中还是在磁盘上。
  • @John1024 好点,我想我对临时文件没问题。我担心的是,这将并行运行,所以 result.txt 文件应该是特定运行的,也许使用 mktemp?
  • @zx8754 您的系统上是否安装了mktemp?如果没有,通常可以使用:paste -d, t1.txt t2.txt > ~/result$$.txt && mv ~/result$$.txt t1.txt
  • @John1024 请用$$mktemp 发布答案,同时我会测试回复你,谢谢。

标签: bash file unix command-line concatenation


【解决方案1】:

使用海绵

sponge 实用程序专为此任务而创建:

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

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

使用 mktemp

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

使用临时文件(不带 mktemp)

如果无法访问mktempsponge,则可以使用:

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

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

$$ 是进程 ID。预计这至少在流程的生命周期内是独一无二的。

【讨论】:

  • 恐怕我没有安装权限。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2011-06-04
    • 2021-06-29
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多