将大型文件拆分为具有一定记录数的较小文件(awk,unix)

时间:2018-08-12 21:43:49

标签: unix awk split

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

我认为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
...

但是使用此命令可以打印所有内容...

2 个答案:

答案 0 :(得分: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个长度记录的块。

答案 1 :(得分:0)

答案,基于此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