以下の sorted.txt というソートされたファイルがあるとしましょう。
beautiful
easy
fast
functional
handy
これで、echo fine-grained >> sorted.txt
ファイルの末尾に「handy」の後に「fine-grained」が追加されます。ファイルの順序を変更せずに「Quick」と「Functional」の間に順番に挿入する方法はありますか?
答え1
理論的には可能ですが、魔法のような方法はありません。
どの値を入れたいかを正確に知っている場合は、sed
内部検索と置換を使用して新しい値をファイルに貼り付けることができますが、ソートの複雑さを考慮すると、基本的にどこかでソートする必要があるかどうかによって異なります。キューにあります。
echo fine-grained >> sorted.txt
sort sorted.txt > sorted.txt.new && mv sorted.txt{.new,}
またはsponge
:
{ echo fine-grained ; cat sorted.txt } | sort | sponge sorted.txt
編集する: ザイルズ-m
作業速度を上げるためにソートパラメータを使用する方法については良い提案がありました。マニュアルから:
-m, --merge merge already sorted files; do not sort
これにより、ソートが入力全体を処理するのを防ぎ、入力ファイルをスキャンしてファイル間の関係を特定するだけです。
echo fine-grained | sort -m sorted.txt - | sponge sorted.txt
答え2
ファイルにデータを挿入できません。 POSIX API にはこれに対する規制はありません。最善の方法は、移動されていないすべてのデータを見つけて新しい行を作成し、次のデータをすべて下に移動することです。これは、独自のプログラムを書くことなく達成するのは難しく、簡単ではありません。
新しいファイルを作成したい場合は、awkを使用してこれを非常に簡単に実行できます。
awk -v newline=fine-grained '
!inserted && $0 > newline { print newline; inserted=1 }
1
'
スクリプトの最初の行は、スクリプトがまだ挿入されておらず、入力行が挿入する行の後ろにある場合にのみ、挿入したい行を印刷します。また、行が挿入されたことを記録します。
2行目は入力行を印刷します(式1
はtrueで、デフォルトの動作は入力行を印刷するためです。そうする必要はありません){ print }
。
答え3
あなたの質問に対する直接的な答えは「いいえ」です。どこかで一種の種類を実行する必要があります。
答え4
何とか処理する必要があります。時間の問題だけです。しかし、あなたが探しているのは一回限りの取引だと思います。方法はあなた次第で、より速い方法がいくつかあります。
これで作業は完了しますが、自由に別の方法を試してみてください。
echo "$(echo fine-grained | cat - sorted.txt | sort)" > sorted.txt
ファイルを読み取る前に切り捨てることを防ぐために、内部サブシェルから始めて、エコーされた入力をディスクファイルに関連付けます。参照する内容をエコーすると、改行が維持されます。次にソートします。
sort -m
または、Gilesが提案したように圧縮し、UUOCを避けてください。
echo "$(echo fine-grained | sort -m - sorted.txt)" > sorted.txt