Python 将一列拆分为两列
我的数据格式如下:Python 将一列拆分为两列,python,bash,awk,Python,Bash,Awk,我的数据格式如下: ###John### someData1 someData2 SomeData3 ###Mike### someData1 someData2 ###Ford### someData1 someData2 SomeData3 someData4 someData5 SomeData6 我希望输出为: John someData1 someData2 someData3 Mike someData1 someData2 Ford
###John###
someData1
someData2
SomeData3
###Mike###
someData1
someData2
###Ford###
someData1
someData2
SomeData3
someData4
someData5
SomeData6
我希望输出为:
John someData1
someData2
someData3
Mike someData1
someData2
Ford someData1
someData2
someData3
someData4
someData5
someData6
这里的问题是每个名称下的数据数量(somedata?)不同,并且不是预先知道的。我唯一需要处理的是表示新名称开始的前导字符####
Somedata?
是一个单词。关于如何实现这一点,有什么想法吗?我会使用以下方法:
def fixup(iterable):
it = iter(iterable)
for x in it:
if x.startswith('###'):
yield '\n{0}\t{1}'.format(x.strip('#'),next(it))
else:
yield '\t{0}'.format(x)
这将在第一行为您提供一个额外的换行符,但如果您真的愿意,可以很容易地将其删除。Awk非常适合:
$ awk '/^#/{gsub(/#/,"");printf "%s",NR!=1?"\n"$0:$0;next}{print "\t"$0}' file
John someData1
someData2
SomeData3
Mike someData1
someData2
Ford someData1
someData2
SomeData3
someData4
someData5
SomeData6
似乎Mac
上的awk
不支持三值运算符?:代码>因此请改用此Mac
友好版本:
$ awk '/^#/{gsub(/#/,"");printf n"%s",$0;n="\n";next}{print "\t"$0}' file
您可以通过重新拆分轻松拆分数据
import re
namesInfo = re.split('###(.*?)###', dataString)
然后得到一个名称数组,后跟相关数据。
然后,您可以解析每个名称的数据。itertools方法:
from itertools import groupby
with open('yourfile') as fin:
for k, g in groupby(fin, lambda L: L.startswith('###')):
if k:
name = next(g).strip('#\n')
else:
print '{}\t{}'.format(name, next(g)),
for line in g:
print '\t{}'.format(line),
print
以下给出了所需的精确输出:
from sys import stdout
with open('file') as f:
for n,line in enumerate(f):
if line.startswith('###'):
stdout.write(('' if not n else '\n')+line.strip('#\n'))
else:
stdout.write('\t'+line)
输出:
John someData1
someData2
SomeData3
Mike someData1
someData2
Ford someData1
someData2
SomeData3
someData4
someData5
SomeData6
或者使用x.strip('#')
而不是.replace()
:-)是否确实有效?它向我抛出一个错误,在源代码第1行说语法错误/^#/{gsub(/#/,“”);printf>>>>%s”,NR!=请尽可能确定,看看这里您在哪个平台上,您有什么版本的awk
吗?$awk-version
提供了awk版本20070501。它仍然会给我同样的错误。您似乎有旧的/坏的awk
您在Solaris上吗?您需要使用/usr/xpg4/bin/awk
。@Sunil有趣的是,我记录的在mac机器中,它不喜欢三元运算符,我已经添加了一个mac友好的答案,但我建议您安装GNU awk
:]组之间不要用空行分隔。@sunil然后只添加一个print
-不能在mo的移动设备上编辑帖子