【问题标题】:convert comma separated list in text file into columns in bash将文本文件中的逗号分隔列表转换为 bash 中的列
【发布时间】:2014-03-07 18:43:02
【问题描述】:

我已经成功地提取了进入表格的数据(从 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
 .  .  .  .
 .  .  .  .
 .  .  .  .

我正在解析网页中的数据,并最终计划使该过程尽可能自动化,以便在将数据输出为良好格式后轻松处理数据。

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

【问题讨论】:

  • 为什么你的输入是那种特定的格式?你是用其他语言创建的吗?
  • 是的(对于您的第二个问题),我使用 python 从网页的源代码中提取了它。使用 bash 解析文本输出似乎更容易。
  • 你有python数据结构(字典或列表)中的数据吗?如果是这样,留在 python 中可能会更容易(更快)..
  • 是的,抱歉耽搁了。我不得不修改我的最终目标,我认为在 python 中它会更容易/更有效。我会回来提供详细信息,因为解决方案现在可能在此页面上。

标签: bash list parsing text transpose


【解决方案1】:

既然你在 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

【讨论】:

    【解决方案2】:

    基于 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
    ..........
    ..........
    

    【讨论】:

      【解决方案3】:

      另一种解决方案,但它仅适用于 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)
      

      【讨论】:

        【解决方案4】:

        如果名为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

        【讨论】:

        • 我有 command not found: rs 它驻留在哪个包中?
        • 这是一个标准的 FreeBSD/Linux/MacOSX 命令:参见unix.com/man-page/freebsd/1/rs -- 你可能需要执行“yum search rs”然后安装正确的包。
        • 我不确定这个命令是标准的。至少它在默认的 Ubuntu 安装中不存在,我找不到它,因为 apt-cache search rs 返回超过 16k 行..
        • rs 长期以来一直是 FreeBSD、Solaris、MacOSX 的标准。使用 Ubuntu 的人必须更加努力才能拥有与其他发行版相同的功能,而不仅仅是“rs”。见这篇文章:danielmiessler.com/blog/categories/linux。请特别查看此链接:danielmiessler.com/blog/…
        • 这里是 Ubuntu 的“rs”的指针 - manpages.ubuntu.com/manpages/raring/man1/rs.1.html
        猜你喜欢
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2020-04-07
        • 2017-06-04
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多