【问题标题】:Split large file into smaller files with certain number of records (awk, unix)将大文件拆分为具有一定数量记录的较小文件(awk,unix)
【发布时间】:2019-01-19 15:20:13
【问题描述】:

我正在尝试将一个大文件(>30,000 条记录)拆分为多个文件,每个文件包含

我认为 awk 可能是解决这个问题的方法。

示例文件:

proteins.txt
    >gi|1000108|gb|AAA92500| melatonin receptor [Xenopus laevis]
    hsswynrlfsnsgticyvglvwvlalgailpnlfvgslrcdprifsctfaqyvssyytiavvifhfflpigvvsycylriwvlvlnirhrvkpdrhlhhqtwpynihgfitmfvvfvlfavcwgplniigltvaiypplgdsipqwlfvasyf
    >gi|1000110|gb|AAA92501| melatonin receptor [Xenopus laevis]
    hsfvyeklfslwntilyvcliwtltvvatvpnffvgsleydpriysctfvqtvsssytitvvvihfilpitvvtfcylriwilviqvrrkvksefkprmkqsdfrnfltmfvvfvifafcwaplnfiglavsinptevapkipewlfvvsyf
    >gi|1000406|gb|AAB34773| xCRABP=cellular retinoic acid binding protein [Xenopus laevis, stage 22/24 embryos, Peptide, 147 aa]
    mpnfsghwkmkqsenfeemlkalgvnlmlrkiavaaaskpaveikqegetfyiktsttvrtteinfklgggfdeqtvdgrncrslpewenenkihctqtvlegegpktswtrelandealiltmtaddvvctriyvrelnfwitpsl

每条记录由“>”分隔

所以一条记录是:

>gi|1000108|gb|AAA92500| melatonin receptor [Xenopus laevis]     
hsswynrlfsnsgticyvglvwvlalgailpnlfvgslrcdprifsctfaqyvssyytiavvifhfflpigvvsycylriwvlvlnirhrvkpdrhlhhqtwpynihgfitmfvvfvlfavcwgplniigltvaiypplgdsipqwlfvasyf

我的想法是这样的:

awk -F, 'RS=">", {x=(NR<4000); print x}' proteins.txt > proteins4000.txt
awk -F, 'RS=">", {x=(NR>=4000 & NR <8000); print x}' proteins.txt > proteins8000.txt
...

但是所有东西都用这个命令打印...

【问题讨论】:

  • 当您搜索 [awk] split files 时进行 1600 次以上的质量检查。当然,这个 Q 已被多次回答。祝你好运。
  • 不按记录数拆分...很多按行数拆分。我的记录是多行的。会继续看。
  • 你为什么不做head -10 myProblematicDataFile | awk '-v RS="&gt;" {print NR "\t" $0}'你应该得到你的前10条记录。您似乎已经知道如何使用RS。但我真的建议要么返回您的源数据并正确配置它以每条记录输出 1 行数据,或者使用 sed 脚​​本将每 2 行部分预加入一条记录,然后处理拆分。祝你好运。
  • 谢谢,我听取了您的建议,并直接通过 stackoverflow 结果搜索了更多内容,而不是通过谷歌搜索。想出了上面发布的答案。
  • 每条记录总是2行吗?

标签: unix awk split


【解决方案1】:

你可以用 FNR 做数学,比如:

awk  'BEGIN{RS="\n[ \t]*>"; bl=4000}
                    FNR==1{sub(/^[ \t]*>/,"")}
                    {printf ">%s\n", $0 > "file" int(FNR / bl) }
                    ' file

这会将文件分成bl 长度记录的块file0 file1 file2 等。

【讨论】:

    【解决方案2】:

    回答,基于此stackoverflow... 可能有一些我并不真正需要的元素。

    创建程序parse.awk

    BEGIN { RS=">" } NF {printf("%s", d $0) > "file" i ".txt"}(NR)%n == 0 {close("file" i ".txt") i++} {d = RT}
    

    然后运行:

    gawk -f parse.awk n=4000 proteins.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多