将文本文件中的逗号分隔列表转换为bash中的列

时间:2014-03-07 18:43:03

标签: bash list parsing text transpose

我设法从表格中提取数据(来自html页面),并且我已将所述表格的列隔离成包含以下行的文本文件:

[30,30,32,35,34,43,52,68,88,97,105,107,107,105,101,93,88,80,69,55],
[28,6,6,50,58,56,64,87,99,110,116,119,120,117,114,113,103,82,6,47],
[-7,,,43,71,30,23,28,13,13,10,11,12,11,13,22,17,3,,-15,-20,,38,71],
[0,,,3,5,1.5,1,1.5,0.5,0.5,0,0.5,0.5,0.5,0.5,1,0.5,0,-0.5,-0.5,2.5]

每个括号内的数字列表代表一列。我想做的是将这些列表转换为可以使用不同数据格式的实际列。我也想确保包括这些列表的空白部分(即“[,,,]”)

这基本上就是我想要完成的事情:

30 28 -7  0
30  6    
32  6     
35 50 43  3
34 58 71  5
43 56 30  1.5
52 64 23  1
 .  .  .  .
 .  .  .  .
 .  .  .  .

我正在从网页中解析数据,并最终计划使流程尽可能自动化,这样我就可以在将数据输出到一个不错的格式后轻松处理数据。

任何人都知道如何执行此操作,有任何建议或想法编写脚本吗?

4 个答案:

答案 0 :(得分:2)

由于你在python中有你的列表,只需在python中执行:

l=[["30", "30", "32"], ["28","6","6"], ["-7", "", ""], ["0", "", ""]]
for i in zip(*l):
  print "\t".join(i)

产生

30      28      -7      0
30      6
32      6

答案 1 :(得分:1)

基于awk的解决方案:

awk -F, '{gsub(/\[|\]/, ""); for (i=1; i<=NF; i++) a[i]=a[i] ? a[i] OFS $i: $i}
      END {for (i=1; i<=NF; i++) print a[i]}' file
30 28 -7 0
30 6  
32 6  
35 50 43 3
34 58 71 5
43 56 30 1.5
52 64 23 1
..........
..........

答案 2 :(得分:0)

另一种解决方案,但它仅适用于包含4行的文件:

$ paste \
<(sed -n '1{s,\[,,g;s,\],,g;s|,|\n|g;p}' t) \
<(sed -n '2{s,\[,,g;s,\],,g;s|,|\n|g;p}' t) \
<(sed -n '3{s,\[,,g;s,\],,g;s|,|\n|g;p}' t) \
<(sed -n '4{s,\[,,g;s,\],,g;s|,|\n|g;p}' t)
30  28  -7  0
30  6       
32  6       
35  50  43  3
34  58  71  5
43  56  30  1.5
52  64  23  1
68  87  28  1.5
88  99  13  0.5
97  110 13  0.5
105 116 10  0
107 119 11  0.5
107 120 12  0.5
105 117 11  0.5
101 114 13  0.5
93  113 22  1
88  103 17  0.5
80  82  3   0
69  6       -0.5
55  47  -15 -0.5
        -20 2.5

        38  
        71  

更新:或其他预处理版本:

$ sed 's|\[||;s|\][,]\?||' t >t2
$ paste \
<(sed -n '1{s|,|\n|g;p}' t2) \
<(sed -n '2{s|,|\n|g;p}' t2) \
<(sed -n '3{s|,|\n|g;p}' t2) \
<(sed -n '4{s|,|\n|g;p}' t2)

答案 3 :(得分:0)

如果名为data的文件包含问题中给出的数据(完全如上所定义),则以下bash命令行将生成所请求的输出:

$ sed -e 's/\[//' -e 's/\]//' -e 's/,/ /g' <data | rs -T

实施例:

cat data
[30,30,32,35,34,43,52,68,88,97,105,107,107,105,101,93,88,80,69,55],
[28,6,6,50,58,56,64,87,99,110,116,119,120,117,114,113,103,82,6,47],
[-7,,,43,71,30,23,28,13,13,10,11,12,11,13,22,17,3,,-15,-20,,38,71],
[0,,,3,5,1.5,1,1.5,0.5,0.5,0,0.5,0.5,0.5,0.5,1,0.5,0,-0.5,-0.5,2.5]

$ sed -e 's/[//' -e 's/]//' -e 's/,/ /g' <data | rs -T 30 28 -7 0 30 6 43 3 32 6 71 5 35 50 30 1.5 34 58 23 1 43 56 28 1.5 52 64 13 0.5 68 87 13 0.5 88 99 10 0 97 110 11 0.5 105 116 12 0.5 107 119 11 0.5 107 120 13 0.5 105 117 22 1 101 114 17 0.5 93 113 3 0 88 103 -15 -0.5 80 82 -20 -0.5 69 6 38 2.5 55 47 71