以下のような数千行のテキストを含むテキスト ファイルがあります。
123 hello world
124 foo bar
125 hello world
行のサブセクションをチェックして重複をテストしたいと思います。上記の場合、次のように出力されます。
123 hello world
124 foo bar
これを行うことができるvimコマンドはありますか?
更新:私はWindowsマシンを使用しているため、uniqを使用できません
以下のような数千行のテキストを含むテキスト ファイルがあります。
123 hello world
124 foo bar
125 hello world
行のサブセクションをチェックして重複をテストしたいと思います。上記の場合、次のように出力されます。
123 hello world
124 foo bar
これを行うことができるvimコマンドはありますか?
更新:私はWindowsマシンを使用しているため、uniqを使用できません
これは bash コマンドです。
sort -k2 input | uniq -s4
sort -k2
ソート時に最初のフィールドをスキップしますuniq -s4
先頭の 4 文字をスキップしますvim では、上記の外部コマンドを呼び出すことができます。
:%!sort -k2 % | uniq -s4
%
は現在のファイル名に展開されます。実際、次のコマンドを使用してvimでソートできます。
:sort /^\d*\s/
ソート後、次のコマンドを使用して重複行を削除します。
:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
\v
をオンにします。$
newline( ) の直前の位置に一致します\n
。ただし、ここでは必要ないと思います。awk の使用:
$ awk '!a[$2$3]++' file
123 hello world
124 foo bar
配列に入る最初の要素はカウントを1に設定するため、否定によりfalseになるため、それ以降の出現は配列に入力されません。
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
VIMでは、次のコマンドで重複をソートして削除できました
:sort u