【问题标题】:combine two files and overwrite original file using cat合并两个文件并使用 cat 覆盖原始文件
【发布时间】:2017-08-22 09:57:21
【问题描述】:

我尝试使用cat 命令合并两个文件,但遇到了问题。

original.txt
============ 
foo
bar
foo
bar

以下是我的脚本。

cat original.txt | wc -l > linecount.txt | cat linecount.txt original.txt > original.txt

此脚本返回“输入文件和输出文件相同”的错误。

预期的结果是这样的。

original.txt
============
4
foo
bar
foo
bar

有什么想法吗?

【问题讨论】:

    标签: bash unix cat


    【解决方案1】:

    你可能会使用:

    { wc -l < original.txt; cat original.txt; } > linecount.txt &&
    mv linecount.txt original.txt
    

    或者使用awk:

    awk 'NR==FNR{++n; next} FNR==1{print n} 1' original.txt{,} > linecount.txt &&
    mv linecount.txt original.txt
    

    或者:

    awk -v n=$(wc -l < original.txt) 'NR==1{print n} 1' original.txt > linecount.txt &&
    mv linecount.txt original.txt 
    

    【讨论】:

    • 第一个很好很简单(虽然wc -l original.txt可能更清楚)
    • wc -l original.txt 还打印带有行数的文件名
    【解决方案2】:

    您可以使用 moreutils 包中的 sponge。我喜欢它:

    cat <(wc -l orig.txt) orig.txt | sponge orig.txt
    

    如果你没有sponge或者无法安装它,你可以用awk作为bash函数来实现它:

    function sponge() {
        awk -v o="${1}" '{b=NR>1?b""ORS""$0:$0}END{print b > o}'
    }
    

    请记住,这需要将整个文件存储在内存中。不要将它用于非常大的文件。

    【讨论】:

    • 我的 OSX 上没有 sponge,让我看看能不能得到它。
    • 无论是我的环境,无论如何该功能都有助于培养我的shell脚本知识。谢谢你的帮助。
    • 对于sponge,您需要brew install moreutils。 shell函数有什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2016-08-08
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多