2

テキスト ファイルが最初に並べ替えられた場所で結果が並べ替えられるように、テキスト ファイルに行を追加したいと考えています。例えば:

cp file tmp; echo "new line" >> tmp; sort tmp > file; rm -f tmp

私は本当に一時ファイルなしでセミコロンなしでそれをやりたいと思っています(代わりにパイプを使用していますか?); の使用sedは許容されます。これは可能ですか?

4

5 に答える 5

7

これは、一時ファイルなしで考えられる最も短いライナーです。

$ echo "something" >> file; sort file -o file
于 2012-05-18T19:26:22.470 に答える
7
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

これは、非常に古いソート コマンドでも機能します。

于 2012-05-18T19:30:50.237 に答える
1

ええ、タブがないと仮定しcommて、並べ替えるか、一緒に並べ替える必要があります(既に並べ替えられている場合)。これにより、並べ替えが節約されます(ファイルサイズに応じて一時ファイルとオーバーヘッドが生成される可能性があります)。

別: comm -3 file <(echo "new line") |tr -d '\t'

これは「最短」かもしれません: sort -m file <(echo "new line")

于 2012-05-18T19:29:36.433 に答える
0

セミコロンや一時ファイルなしでこれを行うことができますが、どこにもない可能性があるいくつかのユーティリティ (インプレース ファイル変更を伴う awk、または perl など) に依存しないとおそらく不可能です。

一時ファイルやセミコロンを使用したくないのはなぜですか?

編集:セミコロンは大丈夫なので、どうですか:

val=$(cat file); { echo "$val"; echo "new line"; } | sort > file
于 2012-05-18T19:17:24.763 に答える