我有一个大约有 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;

最佳答案

看看我对 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 -solution,您可以获得与上述相同的结果:
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

但是,如果您想要对人眼进行一些很好的对齐,则必须添加一些额外的代码(即,确定每列中最长的字段,填充所有其他条目,...)才能获得所需的内容。

关于linux - 如何将所有段落从垂直重新排列为水平(所有段落彼此相邻),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34483463/

10-13 09:10