gpt4 book ai didi

awk - 多线程 Grep

转载 作者:行者123 更新时间:2023-12-02 03:32:27 25 4
gpt4 key购买 nike

我有以下包含 30233088 个字符串的(大)文件:

head mystringfile.txt:

GAATGAACACGAAGAA
GAATGAACACGAAGAC
GAATGAACACGAAGAG
GAATGAACACGAAGCA

猫序列.txt

AAATAGAGGGCGGTCCAGGCGTGTCGAAACACTGGGTCCAGGGCAAGAGCGGTTCGGGTGTCAGGAAAGCCCCCAAGGGGGTTCGCGCGGTTTGCAGTGAGGTAGAGGCCGGTGTATGGGTAGACAATTGGGGTCCCAAAGAAAAAGGCTCGTCCAACATCATAATAAACCCAAGCACGATAAAAAGCAAACGCAGACTTCAATAGGGTACGAGCAATTGTGGCAGGGTGCTCGCTGTCAGGGTTAGATCTTCTTGGAGTCGCGTCGCTCGGGGGGGCAAGGCCAACGTAAGATCGTGGCTGATCGCTGGCAATGCGGTCGGTTGGGTGGTCGCTAGTAGGGGCACGGCGGTCTCTTATGGCGTCGTAAAATGCGTCTCCAAAGCGAAAAGGGGCGGCAGACAAGTCACCGGGCAAGCTTAGAGGTCTGGGGCCCGTGGCTTTAGGGGAATGAACACGAAGACGCGAAACGAAGTCGTGTTTCTTGTTGGCTGTAGAGGGGAAAACCGTCTGGGGCGATCTGGCGTAGTAGTGCGTGTCTTGCAGTGAGCTCCCCGTCCGTAAGGATTCGCAGGAATCCTGCGTGAAGCTCGGTCGTCTCGGCCGTGTCTCGGGGTTTGATTGCGGGTTCAGATTGGAAAGGTCTCCTCGGGTCGTTTGCTGCATTTGCTCGCAACCCTGACGTGAAAGGGGTGAGCTGTCTCCAATCTGCCACGCTGGGTGTTGCGTCGTCAGTAAAAGACTTGGTCAAGCTGGGACCTCGCAAGATCGCGAGAGGGTTAAGCACAAAAGGTATGGCGAAGCTCCCGGGTGCTCTTGTGGCCACCCAGAATCATGGTGACGTAGGTTTTGCGAAGCCATCAAAAATTCAGGCGGCAAAACGAGCCAGTAGGGTCCTGGGCAGCTGGGCTTGTAGTGGGTAGGCGGCAAAACGCAAAGAATGAACACGAAGCAACTCCGTAGTGTGACGGGGGTTCTGACAAACGTCCTGCAAGAAGTTCGTCTTGGG

我需要在另一个序列文件中grep来确定匹配的位置,我的操作如下:

while read line; do grep -b -o $line sequence.txt >>sequence.txt.count; done<mystringfile.txt

运行这样的代码当然需要很长时间,并且只运行1个线程的一部分,所以我该如何修改它(使用parallelxargs?)这样它就可以在我想要指定的多个线程上运行?

最佳答案

您使用 shell 循环处理文本的想法是错误的。您正在打开一个新的文件描述符,以便为输入文件上的每次 30233088 迭代重定向到输出文件。它很容易产生巨大的性能影响或耗尽打开的文件描述符的情况。

使用正确的工具来完成工作。 Awk 是你的 friend 。如果 sequence.txt 正如您所说只是一个巨大的模式,您可以将其放入正则表达式匹配的变量中,如下所示。该解决方案不涉及必须在 RAM 中存储条目的内存开销

awk -v sequence="$(<sequence.txt)" 'n=index(sequence, $1){print n":"$1}' mystringfile.txt

这应该比您所采用的方法相对更快,为了进一步加快速度,请更改您的区域设置设置以匹配C本地,

LC_ALL=C awk -v sequence="$(<sequence.txt)" 'n=index(sequence, $1){print n":"$1}' mystringfile.txt

要与 grep-b 选项匹配来打印字节偏移量开始,请在上面的答案中使用 n-1而不仅仅是n

如果您仍想使用 GNU 并行,请使用 --pipepart 将文件物理拆分为多个部分,并将 --block 大小指定为文件的 MB 大小阅读内容

parallel -a mystringfile.txt --pipepart --block=20M -q awk -v sequence="$(<sequence.txt)" 'n=index(sequence, $1){print n":"$1}'

关于awk - 多线程 Grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53222347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com