文本文件处理:撤消文本换行(列和行)

时间:2016-12-01 05:04:32

标签: regex shell text

我有一些非常大的文本文件,它们是旧主机应用程序的输出。我不再能够访问源应用程序,但需要对输出执行一些数据分析。

数据基本上是制表符分隔值,但由于源系统,它会包装值并根据行数和行数中断输出

文本文件的内容看起来像这样(这是模型数据):

            Page 1:

            Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8
            ------------------------------------------------------------
            1111    1111    1111    1111    1111    1111    1111    1111
            2222    2222    2222    2222    2222    2222    2222    2222
            3333    3333    3333    3333    3333    3333    3333    3333
            4444    4444    4444    4444    4444    4444    4444    4444
            5555    5555    5555    5555    5555    5555    5555    5555
            6666    6666    6666    6666    6666    6666    6666    6666
            7777    7777    7777    7777    7777    7777    7777    7777
            -----------------------------------------------------------

            Col9    Col10   Col11                   
            --------------------
            1111    1111    1111                    
            2222    2222    2222                    
            3333    3333    3333                    
            4444    4444    4444                    
            5555    5555    5555                    
            6666    6666    6666                    
            7777    7777    7777                    
            --------------------

            Page 2:


            Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8
            ------------------------------------------------------------
            8888    8888    8888    8888    8888    8888    8888    8888
            9999    9999    9999    9999    9999    9999    9999    9999
            -----------------------------------------------------------

            Col9    Col10   Col11                   
            --------------------
            8888    8888    8888
            9999    9999    9999                    
            --------------------

页面会持续一段时间。

我想以编程方式转换文件,以便列是连续的。即。最终的数据集看起来像一个更典型的CSV样式分隔文件。

            Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8    Col9    Col10   Col11 
            ------------------------------------------------------------------------------------                                        
            1111    1111    1111    1111    1111    1111    1111    1111    1111    1111    1111
            2222    2222    2222    2222    2222    2222    2222    2222    2222    2222    2222
            3333    3333    3333    3333    3333    3333    3333    3333    3333    3333    3333
            4444    4444    4444    4444    4444    4444    4444    4444    4444    4444    4444
            5555    5555    5555    5555    5555    5555    5555    5555    5555    5555    5555
            6666    6666    6666    6666    6666    6666    6666    6666    6666    6666    6666
            7777    7777    7777    7777    7777    7777    7777    7777    7777    7777    7777
            8888    8888    8888    8888    8888    8888    8888    8888    8888    8888    8888
            9999    9999    9999    9999    9999    9999    9999    9999    9999    9999    9999
            -------------------------------------------------------------------------------------

我不确定从哪里开始 - 我可以使用像AWK这样的东西来做这个或某种正则表达式。任何关于起点的帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

我建议您可以使用csplit命令和paste命令执行此操作。

答案 1 :(得分:0)

我会使用解析器(例如Bison)。类似的东西:

goal:pages

pages: pages page

page: header rowsOfColumns { dumpCurrentPage(); }

header: "page" num { curColumn = 0; }

rowsOfColumns: rowsOfColumns aRow

aRow: colHeaders dashes colData dashes

colHeaders: colHeaders aHeader { createNewHeader($aHeader); }

dashes: '-'+

colData: colData aData { addToData(curCol++, $aData); }

这是一个非常不完整的答案,但由于没有人评论过去半小时我决定分享我的想法。不幸的是我暂时没有解析,所以我无法给出正确的答案。