【发布时间】:2015-02-09 17:14:01
【问题描述】:
在仅包含字母数字字符的固定宽度文件中,我想替换字母字符和数字字段(包括有符号十进制,但不包括科学计数法)以及数字和数字字段之间的空格,同时保留字母字符值之间的空格。
我知道使用awk 的FIELDWIDTHS 选项,但是我拥有的文件类型太多,具有太多独特的结构,无法一概而论。
这是一个玩具示例:
708 447 4797 JOHN SMITH 18000
需要格式化如下:
708|447|4797|JOHN SMITH|18000
使用sed、perl、awk 等寻找任何便携式解决方案。
编辑:
为了澄清问题并概括出更好的整体可用性,这里有更多行来测试解决方案。请继续假设任何有空格的字母字符确实应该放在一起(即假设没有出现Bob Jones Chuck Smith)。
708 447 4797 JOHN SMITH 18000
708 447 4797 JOHN SMITH 18000
708 447 4797 JOHN SMITH 18000
708 -3.00 4797 JOHN SMITH 18000
应该导致:
708|447|4797|JOHN SMITH|18000
708|447|4797|JOHN SMITH|18000
708|447|4797|JOHN SMITH|18000
708|-3.00|4797|JOHN SMITH|18000
【问题讨论】:
-
如果所有内容都是固定宽度,最安全的方法是读取该行,根据您知道的宽度将字段拆分,然后用新的分隔符将字段重写。
-
@AndyLester 正如问题中所述,很遗憾,我不能依赖文件具有相同的 fwf 结构,并且字段的数量阻碍了每个文件的有效重建。
-
如果你有
123 Bob Jones Chuck Smith 456怎么办? Bob 和 Chuck 是不同的人吗? -
当您在上面说“字符”时,您的意思是“字母”还是其他内容(例如,它是否包含
.、$、[等字符)?当您说“数字”时,您的意思是“整数”还是其他东西(例如,它是否包括像-8、0.5和3e7这样的数字)?您提供的那一行确实是一个非常无望的样本输入集来进行测试。