パターンに基づいて複数の線を結合するにはどうすればよいですか?

パターンに基づいて複数の線を結合するにはどうすればよいですか?

両方の行に共通するパターンに基づいて、ファイル内の複数の行を結合したいと考えています。

これは私の例です:

{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.}

関連情報