Ubuntuで新しいファイルを作成せずに、ファイルから重複行を削除します。

Ubuntuで新しいファイルを作成せずに、ファイルから重複行を削除します。

新しいファイルを作成せずにファイルから重複エントリを削除し、ファイルの内容の順序を保存するためのコマンドが見つからないようです。

uniq他に他のコマンドはありますかawk

sedそれ以外の場合は、内部オプションが含まれていることがわかります。重複を排除する方法を知りません。

重複したサンプル.txtがあります。

1
2
1
サム
4
1

重複したサンプル.txtを削除

1
2
サム
4

答え1

特にGNUawkと最近取得した内部編集機能を使用して

$ cat file
1
2
1
3
4
1
$ awk -i inplace '!seen[$0]++' file
$ cat file
1
2
3
4

たとえばsed -i、「内部編集」を実行するほとんどのツールと同様に、一時ファイルを使用して編集を実行します。ただし、ファイルを手動で移動する必要はありません。

また見なさい:

答え2

コマンドが中断されると、ファイルが破損する危険があります。

{ awk '!seen[$0]++'; 
 python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'; } <sample.txt 1<>sample.txt

中括弧内にコマンドグループを作成し、グループの標準入力にsample.textリダイレクトsample.txtします1<>sample.txt

awk '!seen[$0]++'~である変なイディオム順序を維持しながら重複を排除するために使用されます。

コマンドが終了すると、awk標準出力に対応するファイル記述子はいくつかの中間位置にあるため、そのsample.txt場所sample.txtから切り取る必要があります。私はこれを達成する2つの方法を考えることができます

  1. python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'pythonインストール時にオプションです

  2. GNU Linuxシステムの場合truncate -s "$(awk '/^pos:/{print $2}' /proc/$$/fdinfo/1)" sample.txt

答え3

sortとともに-o

sort -u sample.txt -o sample.txt

-uユニークさのために

-o出力ファイル名の場合

関連情報