使用 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

我想将每组的第一行连接起来形成一行,并重复每组的第二行,直到完成。我如何使用 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;并在必要时将其用作常用命令:

  • 在bash中: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)将行合并为一行。

相关内容