我正在尝试将一个大文件(> 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
...
但是使用此命令可以打印所有内容...
答案 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