我有一个包含10年数据的大文件。我想把它分成几个文件,每个文件包含一年的数据。
文件中的数据格式如下:
GBPUSD,20100201,000200,1.5969,1.5969,1.5967,1.5967,4 GBPUSD,20100201,000300,1.5967,1.5967,1.5960,1.5962,4
字符8-11包含年份。我想使用它作为文件名,并在末尾加上.txt。所以2011.txt,2012.txt等
该文件包含大约400万行。
我使用的是Ubuntu Linux
发布于 2013-02-04 05:05:40
下面是使用awk
的一种方法
awk '{ print > substr($0,8,4) ".txt" }' file
如果第一个字段的长度可以改变,您可以选择:
awk -F, '{ print > substr($2,0,4) ".txt" }' file
发布于 2013-02-04 05:17:22
我认为这应该从命令行开始工作:
YEARS=`cat FILE | sed -e 's/^.......//' -e 's/\(....\).*$/\1/' | sort | uniq` ; for Y in $YEARS ; do echo Processing $Y... ; egrep '^.......'$Y FILE > $Y.txt ; done
发布于 2013-02-04 05:45:08
最好将文件读一遍,并将每一行都写到它应该放到的文件中。所以@steve使用AWK的解决方案是一个很好的解决方案。
您可以使用grep
和适当的正则表达式来解决这个问题:^.......2010
将只匹配在year位置具有2010
的行。然后,shell脚本可以循环多年,并继续运行grep
,如下所示:
for year in 2010 2011 2012; do
grep "^.......$year" datafile > $year.txt
done
但它并不优雅,因为它每年读取整个源文件一次。
下面是与AWK解决方案一起使用的Python解决方案。
import sys
def next_line():
if len(sys.argv) == 1:
for line in sys.stdin:
yield line
else:
for name in sys.argv[1:]:
with open(name) as f:
for line in f:
yield line
_open_files = {}
def output(fname, line):
if fname not in _open_files:
_open_files[fname] = open(fname, "w")
_open_files[fname].write(line)
for line in next_line():
year = line[7:11]
fname = year + ".txt"
output(fname, line)
AWK当然会因为简洁而胜出。我必须实现函数next_line()
来提供一个服务,它依次提供来自每个文件的源代码行,如果您没有指定文件,则提供标准输入;使用AWK,您可以免费获得这些。我必须实现函数output()
来让您只提供文件名和字符串并编写输出,但是使用AWK您可以免费获得这些。
如果您的问题不会变得更加复杂,您可以使用AWK解决方案,但是如果您希望随着时间的推移添加更多花哨的东西,Python解决方案可能会得到回报。(这就是我喜欢Python的原因……一旦你让它工作,不管你需要做什么,都可以很容易地扩展它。)
https://stackoverflow.com/questions/14677260
复制相似问题