Vimエディタを使用して行を接続する

Vimエディタを使用して行を接続する

データがこのように繰り返される長いテキストファイルがあります。

510068893                                     
510069716                                     
620087756                                     
510068729                                     
620089710                                     
560034147                                     
510069875

M                                                      
M                                                   
M
M                                                      
M                                                   
M                                                
M

1957
5/2/1980
1960
1978
5/8/1988
1984
1981

ABASSI FADHIL KHAMIS
ABDALLA HAMAD JUMA
ABDALLA ALI MAHADHI
ABDALLA ALI MFAKI
ABDALLA HAMAD KHAMIS
ABDALLA JUMA ALI
ABDALLA JUMA MABROUK

Sokoni                                                 
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni

510068695                                     
510068680                                     
620086828                                     
560034266                                     
620088288                                     
560033477                                     
510068873

M                                                      
M                                                   
M
M                                                      
M                                                   
M                                                
M

5/10/1983
1985
1937
1951
1974
14/5/1984
1987

ABDALLA KHAMIS ALI
ABDALLA KHAMIS HAMAD
ABDALLA KHAMIS USHURU
ABDALLA MOHAMMED JUMA
ABDALLA MOHAMMED SALEH
ABDALLA OMAR ABEID
ABDALLA OMAR NUHU

Sokoni                                                 
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni                                                
Sokoni

各グループの最初の行を結合して行を形成し、完了するまで各グループの2番目の行を繰り返したいと思います。 VimまたはPerlスクリプトを使用してこれを行うにはどうすればよいですか?

出力は次のとおりです。

510068893, M, 1957, ABASSI FADHIL KHAMIS, Sokoni 510069716, M, 5/2/1980, ABDALLA HAMAD JUMA, Sokoni
620087756, M, 1960, ABDALLA ALI MAHADHI, Sokoni 510068729, M, 1978, ABDALLA ALI MFAKI, Sokoni
etc.

答え1

常に7項目(および空白行)のデータを収集する必要がある場合、awkプログラムはそのデータを収集して最後に印刷します。

awk '{a[NR%8]=a[NR%8]" "$0} END{for (i=1;i<=7;i++) print a[i]}'

(あなたのデータサンプルには末尾の空白がたくさんあるようです。これらの空白を追加せずに削除したい場合は、質問を適切に調整してください。それに応じて答えを調整します。)

編集:上記のコメントの出力例に示すように、カンマ区切り文字を作成するには、次のようにします。

awk '{a[NR%8]=a[NR%8]", "$0} END{for (i=1;i<=7;i++) print substr(a[i],3)}'

答え2

gawk ' BEGIN{RS=""; FS="\n"}
            {for(i=1;i<NF;i++) {a[i]=a[i]" || "$i} } 
       END  {for(i in a){ print a[i]}}'

(このソリューションでは行の順序を変更できます。次のバージョンでは行の順序が維持されます。)

より良い方法は、これを改善し、再利用可能なコマンド「vert_transpose」を作成することです。

#!/usr/bin/gawk -f

BEGIN {RS=""; FS="\n"}
l<=NF {l=NF}
      {for(i=1;i<=NF;i++) { a[i]=a[i]" || "$i } } 
END   {for(i=1;i<=l ;i++) { print a[i]        } }

chmodをインストールし、$HOME/bin必要に応じてストックコマンドとして使用します。

  • バッシュから:vert_transpose longfile
  • vim内部::%! vert_transpose

答え3

各行から末尾のスペースを削除し、末尾に空白行を追加するには、次の手順を実行します。

sed 's/\s*$//;$a\\' very.long.text.file

配管可能

awk '
BEGIN{
 RS="\n\n"
 FS="\n"}
{for (i=1;i<=NF;i++)
     A[i]=A[i] s $i
 s=","}
NR%5==0{
 for(i in A)
     printf "%s,%g\n" ,A[i]
 s=""
 delete A
 print s}'

大容量ファイルに合わせて40行目にメモリを消去します。

答え4

Ctrl+を使用Vしてビジュアルブロックを有効にし、結合したい行を選択し、Shift+ J(たとえば大文字  J)をタップして行を1つにマージします。

関連情報