簡體   English   中英

如何解釋和優化awk數組以匹配和修改兩個文件的公共列

[英]how to interprete and optimize awk arrays for matching and modifying two files' common column

經過一整天的嘗試,讓我的代碼大致完成了(我認為)我所希望的:基於公共列匹配兩個文件,然后將文件1中的另一列添加到文件2中。之前有人問過,我嘗試了許多不同的版本,但是現在可以正常工作了,這是我的印象。

人們已經嘗試在相關情況下為我提供幫助

如何使用awk根據數字范圍向列中添加特定值,以及在awk中打​​印用戶定義函數的輸出會產生意外的令牌錯誤等)

但是不同的解決方案在我腦海中碰撞,現在一團糟。

盡管我的代碼在某種程度上可以正常工作,但它現在兩次打印出匹配行(?),而且速度也很慢。 我確定還有很多要優化的地方,您能否提供一些有關我實際上在做什么以及如何進行改進的提示? 現在這僅用於一對文件,我大約有一千個。

contig_lengths_cut.txt(300.000行):

 k141_157024 1 1011
k141_158290 1 462
k141_158291 1 1648
k141_158292 1 329
k141_158293 1 534
k141_158294 1 497
k141_158295 1 418482
k141_186288 1 324
k141_186289 1 340
k141_186290 1 390
k141_186291 1 206156
k141_186292 1 491
k141_186293 1 759
k141_186294 1 4885
k141_186295 1 2736
k141_185742 1 377
k141_185743 1 6775
k141_185744 1 301

gene_length.txt(50至300行)

k141_185743 1184 gene=phnM_10
k141_186291 1247 gene=phnM_11
k141_186291 1226 gene=phnM_12
k141_157024 350 gene=phnM_9
k141_158295 1160 gene=phnM_10
k141_158295 1145 gene=phnM_11
k141_247338 410 gene=phnM_1

我的代碼:

awk 'NR==FNR { 
            contig[$1]=$3; next}; 
                {for (k in contig) 
                    if ($3 ~ contig[k]) print $0, contig[$1] }' 
contig_lengths_cut.txt gene_length.txt

當前輸出為:

#with the updated data it is not working at all, if I add more lines to the #sample data, it works again...something is going spectacularly wrong

我想要的輸出是:

k141_185743 1184 gene=phnM_10 6775
k141_186291 1247 gene=phnM_11 206156
k141_186291 1226 gene=phnM_12 206156
k141_157024 350 gene=phnM_9 1011
k141_158295 1160 gene=phnM_10 418482
k141_158295 1145 gene=phnM_11 418482    
#k141_247338 410 gene=phnM_1 #no match, don't print

我假設contig[$1]=$3意味着(僅對於第一個文件)文件的第一列用作索引,第三列用作賦值?

對於數組contig中的所有此類元素,第二個文件中的第三列用於匹配嗎? 我認為這沒有太大意義。 但是,如果使用第一列,則會得到100個相同的條目,而如圖所示,則會得到所需的行數。

最后,我打印出第二個文件的整個行+數組的索引列,它代表第一個文件的第三列,對嗎?

對不起,一團糟,請幫助我了解我在這里做什么,所以我不必再問這個頻繁了;-)

您的輸入樣本沒有提供足夠的數據來測試和匹配您的輸出。 但是,我想我明白了您的問題所在。 您正在尋找值的正則表達式匹配,而不是鍵上的完全匹配。 如果您將腳本更改為

awk 'NR==FNR {contig[$1]=$3; next}                    
     $1 in contig {print $0, contig[$1]}' contig_lengths_cut.txt gene_length.txt

應該工作正常。 但是,由於缺少可測試的數據,因此未進行測試。

在速度方面,如果不對文件進行排序,這將是最快的速度。 您也許可以將file1拆分為多個塊,然后針對file2對所有file1塊進行並行運行,然后合並結果。

如果要調試原始代碼,請在打印語句中添加contig[k]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM