我有一个如下所示的数据文件:
xyz123 2.000 -0.3974 0.0 hij123
6.0 lmn123
8.7 efg123
13.9 uvw123
28.5 rst123
abc123 10.000 0.1943 0.0 wxy123
10.7 xyz123
19.9 pqr123
20.6 stu123
20.6 klm123
def123 50.000 -0.2595 19.2 jkl123
26.1 stu123
27.1 def123
27.1 ghi123
27.6 abc123
* uvw123 15.000 -0.3635
lmn123 40.000 -0.3695 19.2 jkl123
26.1 stu123
27.1 def123
27.1 ghi123
27.6 abc123
我需要将它转换成:
xyz123,2.000,-0.3974,0.0,hij123
xyz123,2.000,-0.3974,6.0,lmn123
xyz123,2.000,-0.3974,8.7,efg123
xyz123,2.000,-0.3974,13.9,uvw123
xyz123,2.000,-0.3974,28.5,rst123
abc123,10.000,0.1943,0.0,wxy123
abc123,10.000,0.1943,10.7,xyz123
abc123,10.000,0.1943,19.9,pqr123
abc123,10.000,0.1943,20.6,stu123
abc123,10.000,0.1943,20.6,klm123
def123,50.000,-0.2595,19.2,jkl123
def123,50.000,-0.2595,26.1,stu123
def123,50.000,-0.2595,27.1,def123
def123,50.000,-0.2595,27.1,ghi123
def123,50.000,-0.2595,27.6,abc123
* uvw123,15.000,-0.3635,
lmn123,40.000,-0.3695,19.2,jkl123
lmn123,40.000,-0.3695,26.1,stu123
lmn123,40.000,-0.3695,27.1,def123
lmn123,40.000,-0.3695,27.1,ghi123
lmn123,40.000,-0.3695,27.6,abc123
我如何使用 Python、AWK 或 sed 来做到这一点?
更新:因此,如果您注意到输入数据中有一行看起来像“uvw123 15.000 -0.3635”,当我使用来自 aix 的 python 代码时,该行会被弄乱。有没有办法修改您的代码并正确输出行,例如我显示的行?
请您参考如下方法:
这是一个 Python 解决方案:
import re
with open('data.txt') as f:
prev = []
for line in f:
tok = [t for t in re.split(r'\s+', line.rstrip()) if t]
if len(tok) < len(prev):
tok = prev[:-len(tok)] + tok
print ','.join(tok)
prev = tok
它跟踪每列的最新值(在 prev 中)并使用它来填充当前行中缺失的列。
