2

私は通常、さまざまな数学プログラム内で使用できる一意の識別子を持つ raw ファイルまたは csv ファイルを使用します。最近、レコードを相互に照合する唯一の方法が、テキスト ファイル内で保持されている位置によるファイルのフォルダーを与えられました。

File01.txt の例を次に示します。

AA1000   
AA2222        
AB1X6110305126101234760ABA08B88                   ZZ1111110000  
AB2X611030512612006100901C109Z 001110001110                                    
AB2X611030512612006100901X571Z 007410000000                                                                   
AB1X6110305127101234760ABA10B89                   ZZ1111110022  
AB2X611030512712006101001A571Z 007410000000                                  
AB1X6110305128101234760ABA10C00                   ZZ1111110055  
AB2X611030512812006101001A571Z 007410007410                                    
AC11

行 3 は AB1 で始まり、行 4 から 8 は AB2 で始まり、行の位置 4 から始まる 12 文字のストリングによって示されるように、行 3 に対応します。この 12 文字の文字列がクラスタを照合する唯一の方法ですが、必ずしもすべての行で一意であるとは限りません。4 行目から 8 行目の AB2 グループが 3 行目の AB1 グループに対応していることを知る唯一の方法は、4 行目から 8 行目が 3 行目に続くことです。私のような非プログラマーにとって、これは悪夢です。

私がやりたいことは、File01.txt を読み込んで、AB1 行に到達するまで 1 行ずつループすることです。AB1 ラインを保存してから、ループを続けたいと思います。AB1 行の後には常に、少なくとも 1 つの AB2 行が続きます。AB2 行を配列に書き込み、メモリから AB1 行を追加し、新しい AB1 行が検出されるまでループと配列への書き込みを続けたいと思います。新しい AB1 行はメモリに保存され、次の AB1 行まで上記のように実行され、ファイルの最後 (通常は AC11 行) に到達するまで同様に繰り返されます。

出力ファイルは、次のようになると思います。

AB2X611030512612006100901C109Z 001110001110    AB1X6110305126101234760ABA08B88                   ZZ1111110000                            
AB2X611030512612006100901X571Z 007410000000    AB1X6110305126101234760ABA08B88                   ZZ1111110000                                                         
AB2X611030512712006101001A571Z 007410000000    AB1X6110305127101234760ABA10B89                   ZZ1111110022                                 
AB2X611030512812006101001A571Z 007410007410    AB1X6110305128101234760ABA10C00                   ZZ1111110055    

理想的ではありませんが、そのタイプのデータを処理して文字列を分割することはできます。これは、bash や awk、sed などを使用して可能ですか?

私に提供される可能性のあるヘルプ/洞察を事前に感謝します。

4

2 に答える 2

4

要件が正しければ、この小さな awk プログラムが機能します。

awk '/^AB1/{ab1=$0;next}/^AB2/{print $0, ab1}'

これは、AB1 または AB2 で始まらない行では何もせず、AB1/AB2 に続く 12 文字の文字列が等しいかどうかのチェックに失敗します。そのチェックが必要かどうかわかりませんでした。

于 2013-07-29T02:43:27.630 に答える
2

これはうまくいくかもしれません(GNU sed):

sed -r '/^AB1/!d;$!N;/\nAB2/!D;s/\s+$/ /;s/(.*)\n(.*)/\2\1\n\1/;P;D' file

提供された例の間隔は少しぎこちないように見えるので、1 つのスペースに減らしました。

于 2013-07-29T07:56:22.313 に答える