首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在awk中转置数据

在awk中转置数据
EN

Stack Overflow用户
提问于 2021-05-10 01:59:06
回答 2查看 41关注 0票数 1

我有一个基准测试工具,其输出如下所示:

代码语言:javascript
复制
Algorithm       Data Size  CPU Time (ns)
----------------------------------------
bubble_sort     1          16.1
bubble_sort     2          19.1
bubble_sort     4          32.8
bubble_sort     8          74.3
bubble_sort     16         257
bubble_sort     32         997
bubble_sort     64         4225
bubble_sort     128        18925
bubble_sort     256        83565
bubble_sort     512        313589
bubble_sort     1024       1161146
insertion_sort  1          16.1
insertion_sort  2          17.7
insertion_sort  4          26.5
insertion_sort  8          43.7
insertion_sort  16         96.1
insertion_sort  32         263
insertion_sort  64         770
insertion_sort  128        2807
insertion_sort  256        10775
insertion_sort  512        38956
insertion_sort  1024       135419
std_sort        1          17.3
std_sort        2          20.7
std_sort        4          24.4
std_sort        8          32.7
std_sort        16         59.6
std_sort        32         173
std_sort        64         345
std_sort        128        762
std_sort        256        1769
std_sort        512        3982
std_sort        1024       18500

我试着把它变得更像这样:

代码语言:javascript
复制
Data Size  bubble_sort  insertion_sort  std_sort
1          16.1         16.1            17.3
2          19.1         17.7            20.7
4          32.8         26.5            24.4
8          74.3         43.7            32.7
16         257          96.1            59.6
32         997          263             173
64         4225         770             345
128        18925        2807            762
256        83565        10775           1769
512        313589       38956           3982
1024       1161146      135419          18500

有没有使用awk实现这一点的简单方法?我最感兴趣的是最终表中的数字,所以标题行并不重要。

==

编辑:

实际上,我可以使用以下代码来实现这一点

代码语言:javascript
复制
{
  map[$1][$2] = $3
}

END {
  for (algo in map) {
    some_algo = algo
    break;
  }

  printf "size "
  for (algo in map) {
    printf "%s ", algo
  }
  print ""

  for (size in map[some_algo]) {
    printf "%s ", size 
    for (algo in map) {
      printf "%s ", map[algo][size]
    }
    printf "\n"
  }
}

这是可行的。然而,它有两个小问题:它看起来有点难读,因此,有没有更好、更地道的方法来做这项工作?此外,结果列的顺序与原始数据行中的顺序不同。有没有简单的方法来修复这个订单?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-10 03:45:14

这是另一种选择

代码语言:javascript
复制
$ sed 1,2d file | 
  pr -w200 -3t  | 
  awk 'NR==1{print "Data_Size", $1,$4,$7} {print $2,$3,$6,$9}' | 
  column -t


Data_Size  bubble_sort  insertion_sort  std_sort
1          16.1         16.1            17.3
2          19.1         17.7            20.7
4          32.8         26.5            24.4
8          74.3         43.7            32.7
16         257          96.1            59.6
32         997          263             173
64         4225         770             345
128        18925        2807            762
256        83565        10775           1769
512        313589       38956           3982
1024       1161146      135419          18500
票数 0
EN

Stack Overflow用户

发布于 2021-05-11 01:28:17

这里有一个Ruby可以做到这一点。

Ruby非常类似于awk,但增加了一些函数和数据结构。这样做的好处是,如果其中一个数据值丢失,它将通过插入n/a来正确处理丢失的值。

代码语言:javascript
复制
$ sed 1,2d file |
ruby -lane 'BEGIN{
    h=Hash.new {|n,k| n[k]={} }
    l="Data_Size"
}
    h[l][$F[1]]=$F[1]
    h[$F[0]][$F[1]]=$F[2]
END{
    puts h.keys.join("\t")
    h[l]=h[l].sort{|a,b| a[0].to_i<=>b[0].to_i}.to_h
    h[l].each_key { |k|
        a=[]
        h.each_key { |j|
            a.push(h[j][k] || "n/a")
        }
    puts a.join("\t")
    }

}' | column  -t

以您的示例为例,删除bubble_sort 4 32.8 prints行:

代码语言:javascript
复制
Data_Size  bubble_sort  insertion_sort  std_sort
1          16.1         16.1            17.3
2          19.1         17.7            20.7
4          n/a          26.5            24.4
8          74.3         43.7            32.7
16         257          96.1            59.6
32         997          263             173
64         4225         770             345
128        18925        2807            762
256        83565        10775           1769
512        313589       38956           3982
1024       1161146      135419          18500
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67460839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档