合并两个文件并使用cat覆盖原始文件

时间:2017-08-22 09:57:22

标签: bash unix cat

我尝试使用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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用:

{ 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 

答案 1 :(得分:0)

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

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}'
}

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