首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在linux中,根据文件中的文本拆分大文件的最快方法

在linux中,根据文件中的文本拆分大文件的最快方法
EN

Stack Overflow用户
提问于 2013-02-04 05:01:18
回答 3查看 1.9K关注 0票数 6

我有一个包含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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-04 05:05:40

下面是使用awk的一种方法

代码语言:javascript
运行
复制
awk '{ print > substr($0,8,4) ".txt" }' file

如果第一个字段的长度可以改变,您可以选择:

代码语言:javascript
运行
复制
awk -F, '{ print > substr($2,0,4) ".txt" }' file
票数 7
EN

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2013-02-04 05:45:08

最好将文件读一遍,并将每一行都写到它应该放到的文件中。所以@steve使用AWK的解决方案是一个很好的解决方案。

您可以使用grep和适当的正则表达式来解决这个问题:^.......2010将只匹配在year位置具有2010的行。然后,shell脚本可以循环多年,并继续运行grep,如下所示:

代码语言:javascript
运行
复制
for year in 2010 2011 2012; do
    grep "^.......$year" datafile > $year.txt
done

但它并不优雅,因为它每年读取整个源文件一次。

下面是与AWK解决方案一起使用的Python解决方案。

代码语言:javascript
运行
复制
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的原因……一旦你让它工作,不管你需要做什么,都可以很容易地扩展它。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14677260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档