【问题标题】:How to change many row to column如何将多行更改为列
【发布时间】:2018-10-30 23:33:24
【问题描述】:

我有一个文件如下,想在找到指定行时更改为列(这里是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

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

【问题讨论】:

    标签: linux awk text-processing


    【解决方案1】:

    这将在任何 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
    

    【讨论】:

      【解决方案2】:

      复杂的 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
      

      【讨论】:

      • 唯一特定于 gawk 的是使用多维数组语法,但在其余代码中使用它并没有任何好处。只需使用arr[a,b] 而不是arr[a][b],它就可以在任何awk 中工作。
      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多