両方の行に共通するパターンに基づいて、ファイル内の複数の行を結合したいと考えています。
これは私の例です:
{101}{}{Apples}
{102}{}{Eggs}
{103}{}{Beans}
{104}...
...
{1101}{}{This is a fruit.}
{1102}{}{These things are oval.}
{1103}{}{You have to roast them.}
{1104}...
...
私は線をつなぎたい{101}{}{Apples}
し{1101}{}{This is a fruit.}
さらに処理するために1 行にまとめます{101}{}{Apples}{1101}{}{This is a fruit.}
。
他の行についても同様です。
ご覧のとおり、両方の行に 101 という番号が共通していますが、これを実現する方法がわかりません。何かアイデアはありますか?
/編集:
「回避策」を見つけました:
まず、VISUAL BLOCK モードでC-V
(または同様のショートカット) を使用してグループ 2 から先行するすべての "{1" 文字を削除し、 を使用してすべての行を番号順に並べ替え:%sort n
、 と 2 行おきに結合して、 と:let @q = "Jj"
続けます500@q
。
これは機能しますが、 が残ります{101}{}{Apples} 101}{}{This is a fruit.}
。各行に不足している文字「{1」を追加する必要がありますが、これは私が望んでいるものとは少し異なります。ご協力いただければ幸いです。
答え1
を削除する代わりに{1
、
:%sort rn /\d\d\d}/
これにより数値のソートが行われますが、各行では 3 桁の数字とそれに続く } のみが検索されます。
また、後で線をつなげるには、
:g/{\d\d\d}/j!
答え2
シェル内でファイルを使用してこれを行う方法は次のとおりです。
join -j 2 \
<(sed -n '/^{...}/{s/{/{ /;s/}/ }/;p}' inputfile) \
<(sed -n '/^{....}/{s/{./& /;s/}/ }/;p}' inputfile) |
sed 's/^\([^ ]*\) { }{}\({[^}]*}\) {1 }\({.*}\)$/{\1}{}\2{1\1}\3/'
の最初の 2 回の呼び出しを使用して、sed
最初の中括弧セット間の桁数に基づいてファイルを分割し、最後の 3 桁の数字の前後にスペースを追加します ({101}
になり{ 101 }
、{1101}
になります{1 101 }
)。次に、これらの 3 桁の数字をコマンド キーのフィールドとして使用しますjoin
。最後のsed
コマンドは、数字を元の位置に戻し、以前に追加された余分なスペースを削除します。
vim
おそらく、達人なら 内でもっと良いことをできるでしょう。AWKvim
を使用すれば、上記よりももっと簡単なことができます。
答え3
以下は、1 つのパターンに対してコマンドラインから Vim/Ex エディターを使用する例です。
$ ex +'redir @a|sil g/101}/' +'redi>>/dev/stdout|echon join(split(@a),"")' -scq! input.txt
{101}{}{Apples}{1101}{}{This is a fruit.}
複数のパターンの場合は、追加のコマンドで繰り返すか、ループを追加するか、シェルからループします。例:
$ for i in `seq 1 3`; do ex +"redir @a|sil g/10$i}/" +'redi>>/dev/stdout|echo join(split(@a),"")' -scq! input.txt; done
{101}{}{Apples}{1101}{}{Thisisafruit.}
{102}{}{Eggs}{1102}{}{Thesethingsareoval.}
{103}{}{Beans}{1103}{}{Youhavetoroastthem.}
シェルだけを使用してデータを解析すると、はるかに簡単になります。例:
$ grep "101}" input.txt | xargs
{101}{}{Apples} {1101}{}{This is a fruit.}
複数行の場合:
$ for i in `seq 1 4`; do grep "10$i}" input.txt | xargs; done
{101}{}{Apples} {1101}{}{This is a fruit.}
{102}{}{Eggs} {1102}{}{These things are oval.}
{103}{}{Beans} {1103}{}{You have to roast them.}