テキスト ファイルが最初に並べ替えられた場所で結果が並べ替えられるように、テキスト ファイルに行を追加したいと考えています。例えば:
cp file tmp; echo "new line" >> tmp; sort tmp > file; rm -f tmp
私は本当に一時ファイルなしでセミコロンなしでそれをやりたいと思っています(代わりにパイプを使用していますか?); の使用sed
は許容されます。これは可能ですか?
これは、一時ファイルなしで考えられる最も短いライナーです。
$ echo "something" >> file; sort file -o file
echo "New Line" | sort -o file - file
結果をファイルに書き込むことを意味します (また-o file
、入力ファイルのいずれかを出力ファイルとして使用することは明示的に安全です)。単独で、新しい行の-
情報を含む「標準入力を読み取る」ことを意味します。file
末尾の は「また読む」という意味file
です。これは、(少なくとも) 1978 年頃の第 7 版 UNIX™ 以降、およびおそらくそれ以前のすべての Unix ソートで機能します。一時ファイルや他のユーティリティへの依存関係はありません。
1 行が「ソート」されており、ファイルもソートされている場合、ソートされた 2 つの入力をマージするだけでプロセスを高速化できる可能性があります。
echo "New Line" | sort -o file -m - file
これは、非常に古いソート コマンドでも機能します。
ええ、タブがないと仮定しcomm
て、並べ替えるか、一緒に並べ替える必要があります(既に並べ替えられている場合)。これにより、並べ替えが節約されます(ファイルサイズに応じて一時ファイルとオーバーヘッドが生成される可能性があります)。
別:
comm -3 file <(echo "new line") |tr -d '\t'
これは「最短」かもしれません:
sort -m file <(echo "new line")
セミコロンや一時ファイルなしでこれを行うことができますが、どこにもない可能性があるいくつかのユーティリティ (インプレース ファイル変更を伴う awk、または perl など) に依存しないとおそらく不可能です。
一時ファイルやセミコロンを使用したくないのはなぜですか?
編集:セミコロンは大丈夫なので、どうですか:
val=$(cat file); { echo "$val"; echo "new line"; } | sort > file