如何重新排列从垂直到水平的所有段落(彼此相邻)

时间:2015-12-27 18:25:40

标签: linux awk

我有一个大约有25个段落的文件,它们用一个空白行分隔,每个段落有大约2到20行,每行有5列用分号分隔。如何将段落2移到段落旁边1,第3段,右边第2段,依此类推。 我的目标是稍后将所有内容粘贴到Excel中。 这里使用的数字只是任何单词/数字的示例。

111; 111; 111; 111; 111;
111; 111; 111; 111; 111;

222; 222; 222; 222; 222;
222; 222; 222; 222; 222;
222; 222; 222; 222; 222;

333; 333; 333; 333; 333;
333; 333; 333; 333; 333;
333; 333; 333; 333; 333;
333; 333; 333; 333; 333;

期望的输出:

111;111;111;111;111; 222;222;222;222;222; 333;333;333;333;333;    
111;111;111;111;111; 222;222;222;222;222; 333;333;333;333;333;    
                     222;222;222;222;222; 333;333;333;333;333;    
                                          333;333;333;333;333;

1 个答案:

答案 0 :(得分:3)

查看我对How to move everything following a dash to a new column?的回答。

如果您的解决方案不需要基于awk,则以下代码可能会执行您想要的操作:

csplit -f tempfile in.txt '/^\s*$/+1' {*}; paste tempfile* > out.txt

示例数据的输出是

111;111;111;111;111;    222;222;222;222;222;    333;333;333;333;333;
111;111;111;111;111;    222;222;222;222;222;    333;333;333;333;333;
    222;222;222;222;222;    333;333;333;333;333;
        333;333;333;333;333;

如您所见,制表符分隔列,如果您想在out.txt上进行一些后处理,这是一个好主意。

如果需要awk - 解决方案,您将获得与上述相同的结果:

awk 'BEGIN{FS="\n"; RS="\n\n";}
     {for(i=1; i<= NF;i++)
        ar[NR,i]=$i
      nf = nf <NF? NF : nf}
     END{  for(j=1; j <= nf; j++){
             str=""
             for(i = 1; i <= NR; i++){
                  str = str""ar[i,j]"\t"
             }
             print str
           }
         }' in.txt

但是,如果你想为人眼做一些很好的对齐,你将不得不添加一些额外的代码(即,确定每列中最长的字段,填充所有其他条目,......)以获得你想要的。