【问题标题】:Join command for two big files based on one column gives empty output基于一列的两个大文件的连接命令给出空输出
【发布时间】:2021-05-03 07:35:18
【问题描述】:

我在连接两个(大量)文件时遇到了一个大问题,因为我已经尝试了 join 命令和其他 AWK 选项的所有可能组合,我在其他用户的问题中看到了,但结果总是一样的:它不生成输出(我知道有共同的领域)。为了说明问题,我将部分文件留在这里: 文件 1:

SiiA    lcl|NC_003197.2_prot_NP_463122.1_4111   100.000 100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIENKTKSTAQNSGANDDSNPNEIVNKEVNTQDVSDGMTTMSGKEVGVYDIADGQKTDITSTKNELVITYHGRLRSFSEEDTYKIKAWLEDKINSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiA    lcl|NC_010102.1_prot_WP_000389232.1_4169    99.048  100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIENKTKSTAQNSGANDDSNPNEIVNKEVNTQDVSDGMTTMSGKEVGVYDIADGQKTDITSTKNELVITYHGRLRSFSEEDTHKIKAWLEDKTNSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiA    lcl|CP052796.1_prot_QJV25805.1_4154 97.143  100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIESKTKSTAQNSGANDNSNANEIINKEVNTQDMSDGMTTMSGKEVGVYDIADGQKTDITSTKNELVITYHGRLRSFSEEDTHKIKAWLEDKINSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiA    lcl|NZ_CP009559.1_prot_WP_000389229.1_1106  97.143  100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIENKTKSTAQNNGANDNSNANEIVNKEVNTQDVSDGMTTMSGKEVGVYDIADGQKTDITSTKNELVITYHGRLRSFSEEDTHKIEAWLEDKTNSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiA    lcl|NZ_CP029897.1_prot_WP_000389235.1_4284  97.143  100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIENKTKSTAQNSGANDNSNANEIVNKEVNTQDVSDGMTTMSGKEVGVYDIADGQKIDITSTKNELVITYHGRLRSFSEEDTHKIEAWLEDKTNSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiA    lcl|NZ_CP053416.1_prot_WP_079774927.1_2027  77.619  100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMLIMYDNSIKVYKTNIEKHANSKDEKSGDNKKENTNEKVENETISKDSSAESTEMSGKEIGIYDIADDQRIDITSEEKELVITYRGRLRSFSKEDLNKITVWLEDKANSNLLIEMIIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSTASSSTSKAIITTTNKKVPE
SiiB    lcl|NC_003197.2_prot_NP_463123.1_4112   100.000 100 MKYINHYRYLFVCFFLAILPFFALSFPGIREYVFDNFMVSAIYNGVIIAIYITGSLCALFTILKNISAKDILIAQDASRKNSILSNLNQVLFAGESKQCDFNLLMELDDNVSTARNQRLSFIMSCSNVSTLVGLLGTFAGLSITIGSIGNLLSSPSDVGGDNASNTLNMIVTMVASLSEPLKGMNTAFVSSIYGVVCAILLTSQSVFVRSSYSLVSTEIKKLKIISNRANNKQRSLRVESETLVEFKELFKAFFDNYLTVENLRTQDEEKKREMLSDSFVTLQNRLLDNSAKLEQISTLIDGYLVSSNENLKKLSDGVITITSRLSEGNILLADNNARLEAMSTIQNIIDKKNDSIMTSVDKCYQESLSHGKTINDIAAGSADISHTLDGLRKEMDEDMNNVHLALSDLSATDKKIIANTKEISAEMVSYRDTYMPLMEKITSMHQEIVKQRLLNKEEKNED

文件 2:

Salmonella_enterica_subsp_enterica_Typhimurium_LT2 >lcl|NC_003197.2_prot_NP_463122.1_4111
Salmonella_bongori >lcl|NZ_CP053416.1_prot_WP_000427862.1_2024
Salmonella_bongori >lcl|NZ_CP053416.1_prot_WP_079774928.1_2025
Salmonella_bongori >lcl|NZ_CP053416.1_prot_WP_000168315.1_2026
Salmonella_bongori >lcl|NZ_CP053416.1_prot_WP_079774927.1_2027
Salmonella_enterica_subsp_enterica_Typhimurium_LT2 >lcl|NC_003197.2_prot_NP_463123.1_4112
Salmonella_enterica_subsp_enterica_Typhimurium_LT2 >lcl|NC_003197.2_prot_NP_463124.1_4113

预期的输出是:

SiiA    Salmonella_enterica_subsp_enterica_Typhimurium_LT2  lcl|NC_003197.2_prot_NP_463122.1_4111   100.000 100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIENKTKSTAQNSGANDDSNPNEIVNKEVNTQDVSDGMTTMSGKEVGVYDIADGQKTDITSTKNELVITYHGRLRSFSEEDTYKIKAWLEDKINSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiA    Salmonella_bongori  lcl|NZ_CP053416.1_prot_WP_079774927.1_2027  77.619  100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMLIMYDNSIKVYKTNIEKHANSKDEKSGDNKKENTNEKVENETISKDSSAESTEMSGKEIGIYDIADDQRIDITSEEKELVITYRGRLRSFSKEDLNKITVWLEDKANSNLLIEMIIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSTASSSTSKAIITTTNKKVPE
SiiB    Salmonella_enterica_subsp_enterica_Typhimurium_LT2  lcl|NC_003197.2_prot_NP_463123.1_4112   100.000 100 MKYINHYRYLFVCFFLAILPFFALSFPGIREYVFDNFMVSAIYNGVIIAIYITGSLCALFTILKNISAKDILIAQDASRKNSILSNLNQVLFAGESKQCDFNLLMELDDNVSTARNQRLSFIMSCSNVSTLVGLLGTFAGLSITIGSIGNLLSSPSDVGGDNASNTLNMIVTMVASLSEPLKGMNTAFVSSIYGVVCAILLTSQSVFVRSSYSLVSTEIKKLKIISNRANNKQRSLRVESETLVEFKELFKAFFDNYLTVENLRTQDEEKKREMLSDSFVTLQNRLLDNSAKLEQISTLIDGYLVSSNENLKKLSDGVITITSRLSEGNILLADNNARLEAMSTIQNIIDKKNDSIMTSVDKCYQESLSHGKTINDIAAGSADISHTLDGLRKEMDEDMNNVHLALSDLSATDKKIIANTKEISAEMVSYRDTYMPLMEKITSMHQEIVKQRLLNKEEKNED

我尝试过使用 join 命令: join -j2 -o1.1,2.1,1.2,1.3,1.4, 1.5 <(sort -k2 file1) <(sort -k2 file2)(这不起作用,因为它说我没有正确使用该命令) join -2 1 -2 2 <(sort -k2 file1) <(sort -k2 file2)

还有一些 AWK 的选项: awk '{if (NR==FNR) {a[$2]=$1; next} if ($2 in a) {print $1, a[$2] $2, $3, $4, $5}}' file1 file2 或者 awk 'FNR==NR{a[$2]=$1;next} a[$2]==$2{print $0, a[$2]}' file1 file2

我没有其他可以尝试的方法,或者我可以在哪里阅读有关此内容的信息,因为似乎没有任何效果。 提前感谢您的时间:)

【问题讨论】:

  • 调试它,例如通过分而治之。从每个文件中删除一半的列。你还有问题吗?如果没有重新开始,但删除另一半列。你还有问题吗?如果是,请从新文件中删除一半的列。你还有问题吗?重复直到你不再有问题(你可能会自己找出解决方案)或者有一个最小的文件对你可以用于minimal reproducible example你的问题。

标签: bash join awk


【解决方案1】:

根据示例输入,join -j2 的一般问题是file2 中的字段#2 具有> 的“额外”前缀,例如:

# file1 / line #1 / field #2
lcl|NC_003197.2_prot_NP_463122.1_4111

# file2 / line #1 / field #2
>lcl|NC_003197.2_prot_NP_463122.1_4111

由于“额外”> 无法进行连接。

在预处理过程中没有添加(或删除?)“额外”>,对 OP 的示例 awk 进行一个小改动:

awk 'NR==FNR {a[$2]=$1; next} (substr($2,2) in a) {$2=substr($2,2);print $0,a[$2]}' file1 file2

注意: 使用 awk 数组和“大量”文件的一个大问题是您可能会遇到内存不足 (OOM) 错误(取决于需要的实际数据量)存储在awk 数组中)。



回到预处理... OP 可以考虑从file2's 2nd 字段中剥离> 前缀。

使用sed 去除在file2 中遇到的第一个> 的想法(假设这始终是字段#2 的第一个字符):

sed 's/>//' file2

将此添加到 OP 的示例中 join:

join -j2 -o1.1,2.1,1.2,1.3,1.4,1.5 <(sort -k2 file1) <(sed 's/>//' file2|sort -k2)

生成:

SiiA Salmonella_enterica_subsp_enterica_Typhimurium_LT2 lcl|NC_003197.2_prot_NP_463122.1_4111 100.000 100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMIIMYDNSIKVYKANIENKTKSTAQNSGANDDSNPNEIVNKEVNTQDVSDGMTTMSGKEVGVYDIADGQKTDITSTKNELVITYHGRLRSFSEEDTYKIKAWLEDKINSNLLIEMVIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSAASSTTSKAIITTINKKVSE
SiiB Salmonella_enterica_subsp_enterica_Typhimurium_LT2 lcl|NC_003197.2_prot_NP_463123.1_4112 100.000 100 MKYINHYRYLFVCFFLAILPFFALSFPGIREYVFDNFMVSAIYNGVIIAIYITGSLCALFTILKNISAKDILIAQDASRKNSILSNLNQVLFAGESKQCDFNLLMELDDNVSTARNQRLSFIMSCSNVSTLVGLLGTFAGLSITIGSIGNLLSSPSDVGGDNASNTLNMIVTMVASLSEPLKGMNTAFVSSIYGVVCAILLTSQSVFVRSSYSLVSTEIKKLKIISNRANNKQRSLRVESETLVEFKELFKAFFDNYLTVENLRTQDEEKKREMLSDSFVTLQNRLLDNSAKLEQISTLIDGYLVSSNENLKKLSDGVITITSRLSEGNILLADNNARLEAMSTIQNIIDKKNDSIMTSV  DKCYQESLSHGKTINDIAAGSADISHTLDGLRKEMDEDMNNVHLALSDLSATDKKIIANTKEISAEMVSYRDTYMPLMEKITSMHQEIVKQRLLNKEEKNED
SiiA Salmonella_bongori lcl|NZ_CP053416.1_prot_WP_079774927.1_2027 77.619 100 MEDESNPWPSFVDTFSTVLCIFIFLMLVFALNNMLIMYDNSIKVYKTNIEKHANSKDEKSGDNKKENTNEKVENETISKDSSAESTEMSGKEIGIYDIADDQRIDITSEEKELVITYRGRLRSFSKEDLNKITVWLEDKANSNLLIEMIIPQADISFSDSLRLGYERGIILMKEIKKIYPDVVIDMSVNSTASSSTSKAIITTTNKKVPE

注意: OP 的 join 格式 (-o...) 将在字段之间放置单个空格,而 OP 的所需输出显示多个空格(或者那些选项卡?);我将留给 OP 来解决空白区域的差异。

【讨论】:

  • 您好!是的,在发布问题后不久,我发现File2 中有额外的&gt;。我更改了它并再次尝试加入,它仍然无法正常工作。我不知道那里出了什么问题。 AWK 现在可以完美运行,谢谢! :)
  • @AmandaJiménez 如果您从 file2 中删除“>”,您的第一个 join 命令对我有效并生成 3 个所需的行(注意:确保删除1.4, 1.5) 中的空格;当您从 file2 中删除 &gt; 时,我的 join 命令(上图)也有效;在这一点上,我猜测字段 #2 发生了其他变化,这导致它无法正确连接...... ???
  • 由于某种原因,前几天我尝试了它,它仍然没有工作,但你建议的语法现在工作了。当我在终端中写入时,Ir 可以工作,但是当我执行脚本时,它在该行中给了我一个错误。这让我发疯......
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2019-05-12
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多