如何将短划线后的所有内容移动到新列?

时间:2015-12-23 18:20:30

标签: bash awk

我有一个文件,其中有一列文字,短划线( - )分隔不同的行。我想将短划线下的所有内容移动到新列。我的输入文件如下所示:

jim
bob
-
sally 
sue 
ed
-
bill 
-
jerry
curly
phil
-

我希望我的输出文件看起来像这样:

jim    sally    bill    jerry
bob    sue      -       curly
-      ed               phil
       -                -

提前谢谢。

3 个答案:

答案 0 :(得分:5)

您可以尝试使用名为input的输入文件:

 csplit -f tempfile input '/-/+1' '{*}'; paste tempfile*

使用csplit,我们会为所需输出(tempfile01tempfile02,...)中的每个“列”生成一个文件。
接下来,我们合并这些临时文件。使用给定的样本输入,上述命令的输出为:

jim sally   bill    jerry   
bob sue     -       curly   
-   ed              phil    
    -               -   

添加rm tempfile*以进行必要的清理可能是个好主意。

csplit -f tempfile input '/-/+1' '{*}'; paste tempfile* > output; rm tempfile*

答案 1 :(得分:1)

我自己没有尝试过,所以它不太可能以你想要的方式运作。这是一个思考它并使其按您想要的方式工作的机会。在你说“正确”之后,请随意编辑这篇文章。

BEGIN {
    column = 1;
}

/^-$/ {
    column++;
    row = 1;
    next;
}

{
    Word[column,row] = $1;
    Rows[column] = ++row;
}

END {
    for (col = 1; col < column; col++) {
        for (row = 1; row < Rows[col]; row++) {
            printf ("%s\t", Word[col,row]);
        }
        printf ("\n");
    }
}

答案 2 :(得分:1)

有趣的运动,我的gawk命题:

gawk 'BEGIN{row=col=0}
      {d[col][row]=d[col][++row]=$1}
      $1=="-"{col++
              if (row>mrow){
                mrow=row
                }
              row=0
              next}
       END{
         for (r=0;r<=mrow;r++) {
           for (c=0;c<=col;c++) {

            printf("%s\t",d[c][r])
            }
            print ""
        }}' file

<强>结果

jim    sally    bill    jerry       
bob    sue      -       curly       
-      ed               phil        
       -                -