5

以下のような数千行のテキストを含むテキスト ファイルがあります。

123 hello world
124 foo bar
125 hello world

行のサブセクションをチェックして重複をテストしたいと思います。上記の場合、次のように出力されます。

123 hello world
124 foo bar

これを行うことができるvimコマンドはありますか?

更新:私はWindowsマシンを使用しているため、uniqを使用できません

4

4 に答える 4

8

これは bash コマンドです。

sort -k2 input | uniq -s4
  • sort -k2ソート時に最初のフィールドをスキップします
  • uniq -s4先頭の 4 文字をスキップします

vim では、上記の外部コマンドを呼び出すことができます。

:%!sort -k2 % | uniq -s4
  • 2番目%は現在のファイル名に展開されます。

実際、次のコマンドを使用してvimでソートできます。

:sort /^\d*\s/
  • vimはソート時に一致した番号をスキップします

ソート後、次のコマンドを使用して重複行を削除します。

:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
  • バックスラッシュのエスケープが多すぎるのを避けるために、パターンで使用してVERY MAGIC\vをオンにします。
  • 複数行パターンでは、 $newline( ) の直前の位置に一致します\n。ただし、ここでは必要ないと思います。
  • 独自の正規表現を作成できます。
于 2012-11-06T15:24:30.093 に答える
1

awk の使用:

$ awk '!a[$2$3]++' file
123 hello world
124 foo bar

配列に入る最初の要素はカウントを1に設定するため、否定によりfalseになるため、それ以降の出現は配列に入力されません。

于 2012-11-06T15:37:40.573 に答える
0

vimについてはわかりませんが、uniqコマンドで何かを行うことができます。各行の最初の部分をスキップするために使用できる --skip-fields 引数があります。

$ cat test.txt
123 hello world
124 foo bar
125 hello world

$ cat test.txt | sort -k 2 | uniq --skip-fields=1 | sort
123 hello world
124 foo bar
于 2012-11-06T15:25:33.673 に答える
-1

VIMでは、次のコマンドで重複をソートして削除できました

:sort u
于 2016-02-17T14:12:50.337 に答える