如何更改多行到列

时间:2018-05-21 10:18:14

标签: linux awk text-processing

我有一个如下文件,想要在找到专线时更改为列(此处为del_size fq)。

$ cat file.txt
del_size    fq
0   13452
-1  13034
del_size    fq
0   13
-1  0
-2  2155
del_size    fq
0   6600
-1  8
-2  0

enter image description here

非常感谢任何帮助。 感谢。

2 个答案:

答案 0 :(得分:0)

复杂的GNU awk 解决方案:

awk '{
         if (/^del_size/) {
             h = (h? h OFS : "") $0; cnt++;
             if (r_cnt > max_rows) max_rows = r_cnt;
             i = j = r_cnt = 0
         }
         else { 
             arr[cnt][++i] = $0;
             r_cnt++ 
         }
         next
     }
     END{
         print h;
         for (i = 1; i <= max_rows; i++) {
             for (j = 1; j <= cnt; j++) {
                 items = arr[j][i];
                 if (items == "") items = "" OFS "";
                 printf "%s%s", (j == 1 ? "" : OFS), items
             }
             print ""
         } 
     }' OFS='\t' file

输出:

del_size    fq  del_size    fq  del_size    fq
0   13452   0   13  0   6600
-1  13034   -1  0   -1  8
        -2  2155    -2  0

答案 1 :(得分:0)

这将使用任何UNIX框上的任何shell中的任何awk来生成以制表符分隔的输出,然后您可以将其导入到列或导入Excel或之后需要执行的任何操作:

$ cat tst.awk
BEGIN { OFS="\t" }
/^del_size/ { ++numCols; rowNr=0  }
{ $1 = $1 }
NR==1 {
    empty = $0
    gsub(/[^[:space:]]+/,"",empty)
}
{
    cell[++rowNr,numCols] = $0
    numRows = (rowNr > numRows ? rowNr : numRows)
}
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            val = ((rowNr,colNr) in cell ? cell[rowNr,colNr] : empty)
            printf "%s%s", val, (colNr<numCols ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file | column -s$'\t' -t
del_size  fq     del_size  fq    del_size  fq
0         13452  0         13    0         6600
-1        13034  -1        0     -1        8
                 -2        2155  -2        0