10

:sort uファイルからすべての重複行を削除できる、より具体的なバージョンのコマンドを探しています。CSV ファイルを使用しており、2 列目のエントリに重複があるすべての行を削除したいと考えています。つまり、2 行目の列の値が同じである場合、2 つの行は重複していると宣言されます。

たとえば、次のファイルの場合:

a,1,b
g,1,f
c,1,x
i,2,l
m,1,k
o,2,p
u,1,z

問題のコマンドは次のようになります。

a,1,b
i,2,l

2 番目の列のエントリがすべて一意である限り、保持する特定の行の選択は重要ではありません。

上記の出力を生成する Vim コマンドはどれですか?

ありがとう!

4

3 に答える 3

13

コマンドを1回実行するだけでは問題の変換を実行できないため:sort、2段階のプロセスとしてアプローチしてみましょう。

1.最初のステップは、2番目の列の値(最初の列とコンマで区切られている)で行をソートすることです。これを行うには、コマンドを使用して:sort、最初の列と次のコンマに一致する正規表現を渡します。

:sort/^[^,]*,/

:sort各行で指定されたパターンが一致した直後から始まるテキストを比較すると、目的の並べ替え動作が得られます。辞書式ではなく数値で値を比較するには、次のn フラグを使用します。

:sort n/^[^,]*,/

2. 2番目のステップでは、ソートされた行を実行し、2番目の列に同じ値を持つ連続する行のすべてのブロックに1つを除いて、すべての行を削除します。:global特定のパターンに一致するすべての行で特定のExコマンドを実行するコマンドに基づいて実装を構築すると便利です。この目的のために、2番目の列に次の行と同じ値が含まれている行を削除できます。この形式化(列の値内でコンマを使用できないという最初の仮定を伴う)により、次のパターンが得られます。

^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*

このパターンを満たすすべての行でコマンドを実行し、:delete上から下に並べ替えられた順序で実行すると、2番目の列の個別の値ごとに1行だけになります。

:g/^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*/d_

3.最後に、両方の手順を1つのExコマンドに組み合わせることができます。

:sort/^[^,]*,/|g/^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*/d_
于 2012-04-20T02:48:28.310 に答える
1
:sort /\([^,]*,\)\{1}/
:g/\%(\%([^,]*,\)\{1}\1.*\n\)\@<=\%([^,]*,\)\{1}\([^,]*\)/d

最初にインデックス1の列で並べ替えます。次に、列インデックス1が次の行の列インデックス1と一致する任意の行に一致し、それを削除します。

列インデックスはの1{1}です。それは3回繰り返されます。

于 2012-04-20T10:54:09.523 に答える
-1

2列目を使用

(visual + !sort)

3列目を使用

sort -k 3 

また

:sort /.*\%3v/

または

select the lines you wish to sort using the Capital V command. Then enter
!sort -k 3n

または、各行の最初の 2 つの単語をスキップして、次のように並べ替えます。

:%sort /^\S\+\s\+\S\+\s\+/ 

また

最新の列で並べ替え

:%sort /\<\S\+\>$/ r

または、MS OFFICE や OPENOFFICE などの別のプログラムを使用する

于 2013-03-27T13:14:31.760 に答える