5

以下のようなcsvファイルが多数あります。


xxxxxxxx
xxxxx
出荷、YD564n
xxxxxxxxx
xxxxx

1、RR1760
2、HI3503
3、HI4084
4、HI1824


次のようにする必要があります。


xxxxxxxx
xxxxx
出荷、YD564n
xxxxxxxxx
xxxxx

YD564n、1、RR1760
YD564n、2、HI3503
YD564n、3、HI4084
YD564n、4、HI1824


YD564nは出荷番号であり、csvファイルごとに異なります。しかし、それは常に「出荷」の直後に来ます。

どのvimコマンドを使用できますか?

4

6 に答える 6

4

1 つのファイルで、通常モードで次のように入力します。

qqgg/^Shipment,<CR>ww"ay$}j:.,$s/^/<C-R>a,<CR>q

<CR>は ENTER キーであり、<C-R>CTRL-Rであることに注意してください。

これにより、そのファイルが更新され、コマンドがレジスタ q に記録されます。

次に、それぞれのファイル タイプ @q で (通常モードでも)。(これにより、レジスタ q が再生されます)

于 2009-05-15T07:26:20.130 に答える
3

これは、マクロを使用して、複数のファイルに適用することで実行できます。

これが一例です。以下をそのまま入力します。

3gg$"ayiw:6,$s/^/<C-R>a/<CR>:w<CR>:bn<CR>

今では恐ろしいように見えます。もう少しうまく説明できるかどうか見てみましょう。

3gg$: 3 行目の末尾に移動します。

"ayiw: 最後のワードをレジスタにコピーしますa

:6,$s/^/<C-R>a/<CR>: 6 行目以降のすべての行で、先頭のレジスタ a にあるものを置き換えます。

:w<CR>:bn<CR>: 保存して次のバッファに移動します。

これで、これをキーにマップできます。

:nnoremap <C-A> 3gg$"ayiw:6,$s/^/<C-R>a/<CR>:w<CR>:bn<CR>

次に、たとえば200個のcsvファイルがある場合、vimを次のように開きます

vim *.csv

その後

200<C-A>

そこに Ctrl-A を入力すると、すべて完了します。

とはいえ、適切なスクリプト言語でこれを行う方が間違いなく快適で、はるかに簡単です。

于 2009-05-15T07:29:39.077 に答える
2

これは、Perl のワンライナーとして実行できます。

perl -i.bak -e' $c = do {local $/; <>};
                ($n) = ($c =~ /Shipment,(\w+)/);
                $c =~ s/^(\d+,)/$n,$1/gm;
                print $c' shipment.csv

これにより、 の内容が に読み込まshipment.csv$c、出荷 ID が に抽出され$n、すべての CSV 行に出荷番号が追加されます。ファイルは、に保存されたバックアップを使用してその場で変更されますshipment.csv.bak

Vim 内からこれを行うには、フィルターとして適応させます。

:%!perl -e' $c = do {local $/; <>}; ($n) = ($c =~ /Shipment,(\w+)/); $c =~ s/^(\d+,)/$n,$1/gm; print $c'
于 2009-05-15T07:27:23.543 に答える
1

なぜヴィム?

次のシェル スクリプトを試してください。

#!/bin/sh

input=$1

shipment=`grep Shipment $input|awk -F, '{print $2}'`

mv $input $input.orig

sed -e "s/^\([0-9]\)/$shipment,\1/" $input.orig > $input

特定のファイルを反復処理できます。

for input in *.txt
do
    script.sh $i
done
于 2009-05-15T07:31:51.380 に答える
1

また、これは vim にはあまり適していないと思います。代わりに Bash ではどうですか?

FILENAME='filename.csv' && SHIPMENT=`grep Shipment $FILENAME | sed 's/^Shipment,//'` && cat $FILENAME | sed "s/^[0-9]/$SHIPMENT,&/" > $FILENAME
于 2009-05-15T07:32:55.137 に答える
1

まあ、私を叩かないでください、しかし... あなたは考えることができます:vimでこれをしないでください!!

これは、スクリプト言語の典型的な使用例です。基本的な python、perl、または ruby​​ のチュートリアルを受講してください。これに対する解決策はその中にあります。

この正規表現はそれほど難しくなく vim で実行できます。しかし、はるかに簡単な代替手段があります。そして、はるかに柔軟なもの。

于 2009-05-15T07:28:43.617 に答える