我有一个程序,可以在空格分隔的表中输出多行数据。我需要将此输出转换为以分号分隔的列表。
这是一个示例记录。每个字段都有一定数量的字符,并由一定数量的空格填充,但是字段中的字符数和填充空格取决于字段,如下所示:
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD.WithSpace....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
通常,只做类似的事情不会有问题
command | tr -s ' ' ';'
理想情况下会产生这样的结果:
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
然而,如上所述,字段本身可以包含空格,并且使事情变得复杂的是,它们不带引号打印。因此,运行上面的“tr -s ' ';'”命令实际上是这样做的:
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD;WithSpace;<etc>
^ <-- Problem here :(
我一生都无法弄清楚如何在不破坏值中包含空格的字段的情况下从这些数据创建一个以分号分隔的列表。如果有人知道如何解决这个问题,那就太棒了!
答案1
我认为您应该首先预处理所有字段值,尝试检测字段的格式并将其转换为正则表达式,然后在添加分隔符之前规范化文本。
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD5xxxxxxxx <etc>
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD5xxxxxxxx <etc>
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD 7xxx <etc>
正则表达式字段格式:
(FIELD[\s\dx]+)
==> 使用sed/awk...更新到新的字段格式==> 添加分隔符。