2017-08-22 12 views
1

catコマンドを使用して2つのファイルを結合しようとしましたが、問題があります。2つのファイルを結合し、猫を使って元のファイルを上書きする

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 

答えて

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 
+0

最初のものは素敵でシンプルですが( 'wc -l original.txt'がもっと明白かもしれませんが) –

+1

' wc -l original.txt'もファイル名を行数で表示します – anubhava

+1

優秀な点! (私はいつも忘れている) –

0

あなたはmoreutilsパッケージからspongeを使用することができます。私はそのためにそれを好き:

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

あなたはspongeを持っていないか、それをインストールすることができない場合、あなたはbash関数としてawkでそれを実装することができます

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

があることに留意してくださいこれはファイル全体をメモリに保存する必要があります。非常に大きなファイルには使用しないでください。

+0

私はOSXで 'スポンジ'を持っていないので、私はそれを得ることができるかどうか見てみましょう。 – anubhava

+0

私の環境にもかかわらず、とにかく機能は私のシェルスクリプトの知識を育成するのに役立ちます。ご協力ありがとうございます。 –

+0

'sponge'の場合、あなたは' moreutils'をインストールする必要があります。シェル関数の問題は何ですか? – hek2mgl

関連する問題