【发布时间】: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=">" {print NR "\t" $0}'你应该得到你的前10条记录。您似乎已经知道如何使用RS。但我真的建议要么返回您的源数据并正确配置它以每条记录输出 1 行数据,或者使用sed脚本将每 2 行部分预加入一条记录,然后处理拆分。祝你好运。 -
谢谢,我听取了您的建议,并直接通过 stackoverflow 结果搜索了更多内容,而不是通过谷歌搜索。想出了上面发布的答案。
-
每条记录总是2行吗?