【问题标题】:Prepend data from one file to another将数据从一个文件添加到另一个文件
【发布时间】:2012-06-30 06:58:45
【问题描述】:

如何将 file1.txt 中的数据添加到 file2.txt?

【问题讨论】:

    标签: linux file shell prepend


    【解决方案1】:

    下面的命令会将这两个文件合并为一个

    cat file1.txt file2.txt > file3.txt; mv file3.txt file2.txt
    

    【讨论】:

    • 好电话,没想到它是写给自己的。然后是一个中间文件。然后是 mv。调整答案以适应
    • 所以,很简单。非常感谢,走sed 路线在这里绝对没有意义。
    • 看到这个答案的人请注意:不要尝试在像cat file1.txt file2.txt > file2.txt 这样的命令中执行此操作。它将无限循环运行。在我按下 ctrl+C 之前,我有大约 10 秒的时间。 13 行文件和 7 行文件中的 8817181 行。回复者回复的原始评论已被删除,因此不清楚这是一个问题。
    【解决方案2】:

    写入文件的方式类似于 1)。附加在文件末尾或 2).重写那个文件。

    如果你想把file1.txt中的内容放在file2.txt之前,恐怕你需要重写合并后的罚款。

    【讨论】:

      【解决方案3】:

      您可以使用来自moreutilssponge 在管道中执行此操作:

      cat file1.txt file2.txt | sponge file2.txt
      

      【讨论】:

        【解决方案4】:

        使用 GNU sed 的另一种方式:

        sed -i -e '1rfile1.txt' -e '1{h;d}' -e '2{x;G}' file2.txt
        

        即:

        • 在第一行,追加文件file1.txt的内容
        • 在第 1 行,复制模式空间以保留空间,并删除模式空间
        • 在第 2 行,交换保持空间和模式空间的内容,并将保持空间附加到模式空间

        它有点棘手的原因是r 命令附加了内容, 并且第 0 行不可寻址,所以我们必须在第 1 行进行, 将原始行的内容移开,然后在附加文件内容后将其带回。

        【讨论】:

        • macos:您可以安装 gsed(macports,也可能是自制软件)。也就是说,我最终只得到了 file1 的内容,file2 的内容丢失了。
        • 不错的答案,这个不需要在 Ubuntu 上安装任何东西,也不会生成任何垃圾文件。
        • 如果file2.txt 包含单行,这将不起作用
        【解决方案5】:

        如果它在您的系统上可用,那么来自 moreutils 的 sponge 就是为此而设计的。这是一个例子:

        cat file1.txt file2.txt | sponge file2.txt
        

        如果您没有sponge,则以下脚本使用临时文件执行相同的工作。它确保其他用户无法访问临时文件,并在最后清理它。

        如果您的系统或脚本崩溃,您可能需要手动清理临时文件。在 Bash 4.4.23 和 Debian 10 (Buster) Gnu/Linux 上测试。

        #!/bin/bash
        #
        # ---------------------------------------------------------------------------------------------------------------------- 
        # usage [ from, to ]
        #       [ from, to ]
        # ---------------------------------------------------------------------------------------------------------------------- 
        # Purpose:
        # Prepend the contents of file [from], to file [to], leaving the result in file [to].
        # ---------------------------------------------------------------------------------------------------------------------- 
        
        # check 
        [[ $# -ne 2 ]] && echo "[exit]: two filenames are required" >&2 && exit 1
        
        # init
        from="$1"
        to="$2"
        tmp_fn=$( mktemp -t TEMP_FILE_prepend.XXXXXXXX )
        chmod 600 "$tmp_fn"
        
        # prepend
        cat "$from" "$to" > "$tmp_fn"
        mv "$tmp_fn" "$to"
        
        # cleanup
        rm -f "$tmp_fn"
        
        # [End]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-19
          相关资源
          最近更新 更多