10

私のタイトルが自明ではないことは承知していますが、ここで説明してみましょう。

test.txtいくつかの重複行を含むファイル名があります。今、私がやりたいことは、それらの重複する行を削除すると同時にupdate test.txt、新しいコンテンツを削除することです.

test.txt

AAAA
BBBB
AAAA
CCCC

sort -u test.txt重複を削除するために使用できることはわかっていますが、ファイルを新しいコンテンツで更新するには、出力を同じファイルにリダイレクトする方法を教えてください。以下のコマンドは機能しません。

sort -u test.txt > test.txt

では、なぜ上記のコマンドが機能しないのですか?正しい方法は何ですか?

また、他の方法はありますか

sort_and_update_file test.txt

これにより、リダイレクトを必要とせずにファイルが並べ替えられ、自動的に更新されます。

4

5 に答える 5

12

これはあなたのために働くかもしれません:

sort -u -o test.txt test.txt
于 2012-07-07T13:37:33.747 に答える
5

同じファイルから同時に読み取りと書き込みを行おうとしているため、シェルでのリダイレクトは機能しません。> file.txt実際には、並べ替えが実行される前に、ファイルは書き込み用に開かれます ( )

@potongの答えは、ソートプログラム自体がおそらくすべての行をメモリに保存するため機能しますが、入力ファイルと同じである可能性があることをマンページで明示的に指定していないため、私はそれに依存しません(動作する可能性があります)。「その場で」機能することが文書化されていない限り、私はそれをしません(@perrealの答えが機能するか、中間結果をシェルメモリに保存できます)

于 2012-07-07T13:46:44.857 に答える
4

同じファイルの読み取り/書き込みに Sponge を使用する

moreutilsのスポンジユーティリティを使用して、ファイルを書き込む前に標準出力を吸収することができます。これにより、ファイルをシャッフルする必要がなくなり、インプレース編集に近づきます。例えば:

sort -u test.txt | sponge test.txt

サンプル出力

コーパスを使用すると、期待される出力が得られます。

$ cat test.txt 
AAAA
BBBB
CCCC
于 2012-07-07T14:37:08.700 に答える
2

これは見た目ほど非効率的ではありません。

sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt 
于 2012-07-07T13:39:00.117 に答える
0

ファイルをその場で編集するために vim を使用できます。

$ ex -s +'%!sort' -cxa test.txt

複数のファイル:

$ ex -s +'bufdo!%!sort' -cxa *.*
于 2015-04-19T22:28:23.697 に答える