【问题标题】:Split big file in unix based on size and pattern根据大小和模式在unix中拆分大文件
【发布时间】:2017-03-08 12:11:43
【问题描述】:

我有一个巨大的文件,45 GB。我想把它分成4部分。我可以这样做:split --bytes=12G inputfile

问题是它扰乱了文件的模式。此拆分根据大小剪切文件,因此不保留格式。我的输入文件如下所示:

Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag

我想拆分文件,但还要提到在Inspecting 处拆分文件的模式,以便我返回的拆分文件必须如下所示:

Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
 V$ARNT_Q6_01           |      390 (+) |  1.000 |  0.998 | tACGTGgc

还有这个:

Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
 V$ARNT_Q6_01           |      390 (+) |  1.000 |  0.998 | tACGTGgc

NOTE: 这种模式匹配应该是第二个偏好,而第一个应该是大小。例如,将文件拆分为 12 GB 的块,并根据 Inspecting 的模式匹配进行拆分。如果我只基于模式Inspecting 进行拆分,那么我将得到数千个拆分文件,因为这种模式一次又一次地重复。

【问题讨论】:

    标签: linux sed split


    【解决方案1】:

    使用sed 会非常困难,因为您没有简单的方法来跟踪到目前为止读取的字符。 awk 会更容易:

    BEGIN {
        fileno = 1
    }
    {
        size += length()
    }
    size > 100000 && /Inspecting/ {
        fileno++
        size = 0
    }
    {
        print $0 > "out" fileno;
    }
    

    根据您的需要调整大小。 awk可能在处理非常大的数字时遇到问题。出于这个原因,最好跟踪到目前为止读取的行数。

    【讨论】:

    • 您能否解释一下如果 100000 是要读取的行数,然后在下一次“检查”时将其打破,然后它会成为下一个输出文件的一部分?其次,这里的输入文件名是fileno吗?
    • fileno 是输出文件名的一部分,大小以字符而不是行计算。它将所有输入行的字符串长度相加。
    • 你在哪里读取输入文件?对不起我的天真,我是linux操作系统的新手
    • 也许我误解了你的意图......?我不使用split。我直接拆分原文件。
    • 我希望原始文件完好无损(大小 45 GB),然后制作 4 个 12 GB 的新块。我想我会通过awk -f process.awk inputFile.txt > outputFile.txt 来做。其中 process.awk 包含您上面提到的代码,对吗?
    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多