2017-10-11 5 views
-1

私はIveが取り組んでいることに関するいくつかのガイダンスを探しています。私は3つの異なるフォーマットのデータをフォーマットされたデータに変換しようとしています。VIMを使用してAからBへの変換

これは私が変換する必要があるデータである。

ABCDEFGHIJKL  00100  C     N12345678W1234567891234  GND 99999MMY LITTLE TEST    000000000 
ABCDEFGHIJKL  00100  H N12345678W123456789        GND 99999MANOTHER LITTLE TEST   000000000 
ABCDEFGHIJKL  00200  L N12345678W123456789N12345678W12345678912341234            000000000 
ABCDEFGHIJKL  00300  G N12345678W123456789                  000000000 

これは私が希望の出力です:

0010|C|||N12345678|W123456789|123.4 
0010|H|N12345678|W123456789|| 
0020|L|N12345678|W123456789|N12345678|W123456789|123.4|123.4 
0030|G|N12345678|W123456789| 

私は挿入ボタンをマッピングしています

map <Insert> :%s/...................................................$/<ESC> :%s/....................//<ESC> :%s/0  G /\|G\|/e<ESC> :%s/0  C /\|C\|/e<ESC> :%s/0  H /\|H\|/e<ESC> :%s/0  L /\|L\|/e<ESC> :%s/0  R /\|R\|/e<ESC> :%s/e0/\|E0/ge<ESC> :%s/w0/\|W0/ge<ESC> :%s/w1/\|W1/ge<ESC> :%s/ /\|\|<ESC> :%s/e1/\|E1/ge<ESC> :%s/    //e<ESC>:%s/\s\+$//<ESC> :%s#\d\{4}$#\=printf('\|%.1f', str2nr(submatch(0))/10.0)#e<ESC> 

私は次のように少しの制限を加えて変換しています:

最初の4桁の後の文字は、G、C、H、LまたはRのいずれかにすることができます。

私の問題は、findとreplaceを使ってNをNに変更すると、すべてを置き換えて2つを追加するというものです。 ||見つけた最初のNの前に。また、|円弧が描かれているときの小数点で、LとRのどちらかです。

助けてください。

EDIT:

が最後に余分な文字を取り除きます:

:%s/...................................................$/<ESC> 

が先頭に余分な文字を取り除きます:

:%s/....................//<ESC> 

は、余分なスペースを取り除くと追加取得します|最初の文字の前後に:

:%s/0  G /\|G\|/e<ESC> 

余分なスペースを取り除いてaを追加します。最初の文字の前後に:

:%s/0  C /\|C\|/e<ESC> 

余分なスペースを取り除いてaを追加します。最初の文字の前後に:

余分なスペースを取り除いてaを追加します。最初の文字の前後に:

:%s/0  L /\|L\|/e<ESC> 

余分なスペースを取り除いてaを追加します。最初の文字の前後に:

:%s/0  R /\|R\|/e<ESC> 

a |座標のためのコンパスの方向の正面

:%s/e0/\|E0/ge<ESC> 

a |座標のためのコンパスの方向の正面

:%s/w0/\|W0/ge<ESC> 

a |座標のためのコンパス方向の前にある。

:%s/w1/\|W1/ge<ESC> 

追加|| 1組の座標を扱うときのために

:%s/ /\|\|<ESC> 

a |

:%s/    //e<ESC> 

任意の空白と末尾の文字を取り除く:

:%s/\s\+$//<ESC> 

描画するときに座標

:%s/e1/\|E1/ge<ESC> 

のためのコンパス方向のインフロントは私がこれを置く理由はわからwuiteありませんLを使用してCまたは円弧を使用して円を描くと、末尾の数字が10進数に変換され、|それを分離するために、インフロント:

:%s#\d\{4}$#\=printf('\|%.1f', str2nr(submatch(0))/10.0)#e<ESC> 
+2

awkを使用する方が簡単でしょう... – Kent

+2

マッピングを分解し、複数の行に分割し、各行が何を考えているかを教えてください。また、なぜそれぞれのコマンドを ''の代わりに ''で終了するのですか? –

+0

Iveはすでに作成されたマップされたキーコードを分解したものを追加しました。LまたはRで始まるシーケンスを扱うときに、小数点の最初のロットをどのように変換するかを理解する必要があります。余分な座標の前にこれが出てきました::%s/L ..................... N/........ .............. \ | N/e しかし、これはどのように私は必要なものを置き換えるので、任意の文字としてドットを使用する方法任意のアイデアをドットで置き換えますか? – Moneyboi

答えて

0

私はgawk(GNU AWK)を使用することをお勧めします。 FIELDWIDTH変数を使用して、各フィールドの幅をスペースで区切って設定できます。

gawk 'BEGIN{FIELDWIDTHS="12 8 5 5 1 1 9 10 9 10 4 4"; OFS="|"} { for(i=1;i<=NF;i++) { gsub(/^[ \t]+|[ \t]+$/, "", $i); }; x=""; if ($11) { x = $11/10;} y=""; if ($12) { x = $12/10;} print $3, $5, $7, $8, $9, $10, x, y; }' file.txt 

より人間が読める:

BEGIN { 
     FIELDWIDTHS="12 8 5 5 1 1 9 10 9 10 4 4"; 
     OFS="|" 
} 

{ 
     for (i=1;i<=NF;i++) { 
       gsub(/^[ \t]+|[ \t]+$/, "", $i); 
     } 
     x=""; 
     if ($11) { 
       x = $11/10; 
     } 
     y=""; 
     if ($12) { 
       y = $12/10; 
     } 
     print $3, $5, $7, $8, $9, $10, x, y; 
} 

注:これは、あなたが与えたものという若干異なる出力形式です。

フィルタコマンド:!を使用してマッピングを行うことができます。

関連する問題