6

2 つの列に分割し、各列からデータを取得したい行がたくさんあります。データは次のようになります。

current_well.well_number
current_well.well_name
current_well.well_type_code
well_location.section
well_location.range

基本的に私がやりたいことは、期間に基づいて行を分割し、データを 2 つの列に変換してから、各列のデータを取得することです。これが Excel で実行できることは知っていますが、この問題に対する VI ソリューションに非常に興味があります。そんなこと知ってる

%s/\./

文字列を空のスペースでフォーマットします。しかし、データが次のようになったら:

current_well    well_number
current_well    well_name
current_well    well_type_code
well_location   section
well_location   range

各列のすべての値を取得して、別のアプリケーションに貼り付けるにはどうすればよいですか?

4

12 に答える 12

13

Linux の column コマンドは、列の作成に適しています。

:%!column -s . -t

次に、ブロック コピーを使用します。

于 2013-06-10T18:06:31.063 に答える
7

1 つのオプションは、このAlign プラグインを使用してピリオドを整列し、ビジュアル ブロック モードで列をより簡単に選択できるようにすることです。たとえば、これを行う場合:

:%Align \.

最終的には次のようになります。

current_well  . well_number
current_well  . well_name
current_well  . well_type_code
well_location . section
well_location . range

プラグインを使用したくない場合は、列をスペースで埋めてみてください。たとえば、テキストの場合:

:%s/\v(.*)\.(.*)/\=printf("%-16s %s", submatch(1), submatch(2))/

それはあなたを残します:

current_well     well_number
current_well     well_name
current_well     well_type_code
well_location    section
well_location    range

次にCtrl-V、コピーするテキストの列を選択できます。最も広い値よりも広い列幅を選択してください。

于 2009-04-24T21:01:35.990 に答える
4

私はこの問題に何度も遭遇しました。ドットをタブに変更すると、たいていはきれいに並べられますが、実際にはそうではありません。すべての列がタブストップで始まるのは事実ですが、それらが同じタブストップにあるという保証はありません。たとえば、これが元のテキストである場合:

lt1tab.value1
gt1tabstop.value2

あなたがやる:

%s/\./\t/g

タブストップが 8 つのスペースであると仮定すると、次のようになります。

lt1tab  value1
gt1tabstop    value2

代わりに、最後の列 (または必要な列) 以外のすべてを削除することをお勧めします。例えば:

%s/^.*\.//

あなたに残します:

value1
value2

簡単にコピーして貼り付けることができます。


Vim を使用する必要がない場合は、UNIX を使用cutして必要なことを行うことができます。

cut -f2 -d. input_file > output_file
于 2009-04-24T20:48:27.910 に答える
2

私はいつもこれを行っていますが、単にたくさんのスペースを埋めるだけです。

%s/./                     /

次に<c-v>、空のスペースでブロックモードに入るには、目的の列の位置を描画し<、テキストを列に向かって右にシフトしてから、を押し続けます.。数秒かかります。

並べたい特定の列の位置がわかっている場合は、別の方法でそれを行うことができます。最初の行に移動して記録を開始し(qq)、デリメータを見つけ(f.)、スペースの束を挿入し(20i <esc>)、スペースを削除して特定の列(d15|)、次に行(j)を下に移動します。次に、Shiftキーを押しながら、すべての列が揃うまで指を何回も転がします@Q(またはカウントを使用します)。10@q:)

于 2010-12-12T00:15:33.623 に答える
1

明らかに、ブロック選択および/またはExcelを使用した上記の方法はより簡単です。しかし、私はマゾヒストであり、あなたがそれらのいずれにもアクセスできないと仮定して、vi コマンドだけでそれを実行しようとすることにしました。私が思いついた恐ろしいことは次のとおりです。

私の基本的な計画は、結合された列のリストを次々に 2 つのリストに変えることです。これには基本的に、各行を 2 行に分割し、1 行おきにファイルの末尾にコピーする必要があります。

したがって、まず、次のコマンドで各行を 2 行に分割する必要があります。

:%s/\./^M/

次に、ファイルの下部をスイングして空の行を作成し、最初の行に戻ります。これは、後で読みやすくするのに役立ちます。

Go[Esc]
:1

ここで、次のシーケンスをお気に入りのキーにマップする必要があります。

:map [Key] mkjddGp'kj

(レコードの場合、これは現在の行をマークし、その下の行を削除し、その行をファイルの一番下に貼り付け、元の行に戻り、次の行に移動します。)

最後に、マップされたキーをリストの行ごとに 1 回押します。したがって、例のリストでは、5 回押すことになります。リストの最初の行から始めてください!!

最終的に得られるものは次のとおりです。

current_well
current_well
current_well
well_location
well_location

well_number
well_name
well_type_code
section
range

各リストを必要な場所に簡単にコピーできるようになりました。

于 2009-04-24T21:01:05.443 に答える
0

ファイルの先頭:

!}awk -F. '{print $1}' >> %

ファイルが変更されたことが通知されます。L(ロード)オプションを選択します。
元の行の下に空白行を追加し、一番上に戻ります。

for(i=1;i<=NR;i++);print $2 >> %

もう一度Lオプションを選択します

元の行を削除します。
これで、2つのグループの最初と2番目の部分ができました。

于 2013-02-05T00:32:54.407 に答える
0

Ctrl V は列を選択します

于 2009-04-24T20:06:13.750 に答える
0

考えられる解決策の 1 つ:

  1. w (または WORDS の場合は W) 次の単語にジャンプします。
  2. CTRL- R CTRL-Wカーソルの下の単語を取得し、コマンドラインに貼り付けます

これらのコマンドをループで連鎖させてから、独自の方法で出力する必要があります。

于 2009-04-24T20:01:27.600 に答える
0

ビジュアルモードをブロックしないのはなぜですか? Cv、必要なものを選択して、他のアプリケーションに貼り付けます。そのような貼り付けの場合は、おそらく設定する必要があります

:set guioptions+=a

同じように。

うーん、あなたの質問を読み直しました。データを列に分割する方法、または他のアプリに貼り付ける方法を尋ねていますか?


私は今それを手に入れたと思います(3回目の読書)。

あなたが行ったようにして、ドットがあったスペースを取得します。次に、別の置換を行い、スペースをタブに置き換えます。各タブは 15 程度です。綺麗に並べてくれます。次に、それらを選択してどこにでもコピーできます。

たとえば、正規表現を照合して 2 番目の列を選択することもできますが、クリスマス ツリーのように明るくなりますが、ヤンクすることはできません。

于 2009-04-24T20:01:34.277 に答える
0

Ctrl-VCtrl-GまたはCtrl-QCtrl-G(Windows 挿入キー マッピングを使用しているかどうかによって異なります)のいずれかを入力してから、マウスで選択することにより、gvim で列を選択できます。

于 2009-04-24T20:05:15.173 に答える
0

ドットをタブに変換してから、各列をブロック選択します。

:%s/\./ CtrlV-Tab /g

CtrlVを押して列をブロック選択します。

または、タブで区切られた値があるため、Excel の列に直接貼り付けられます。

于 2009-04-24T20:41:00.313 に答える