如果文件 (a) 和 (b) 中的字段 1 匹配,则打印文件 (a) 的字段 2 到文件 (b) 的字段 9

Print field 2 of file (a) to field 9 of file (b) if fields1 in files (a) and (b) match

在 post 中,我请求帮助生成这样的文件 (a):

denovo0  90.2
denovo1  97.7
denovo10     93.8
denovo100    95.3

第二个文件 (b) 的结构如下(8 列,制表符分隔):

    denovo1446  1.0 0.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Rotifera; __Philodinidae; __uncultured_bdelloid_rotifer
    denovo3423  0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Enoplea
    denovo13975 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Rotifera; __Philodinidae; __uncultured_bdelloid_rotifer
    denovo14362 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Enoplea; __Qudsianematidae
    denovo18854 0.0 29.0    0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Chromadorea; __Plectidae
    denovo19256 0.0 0.0 0.0 0.0 0.0 1.0 Eukaryota; __Opisthokonta; __Metazoa; __Arthropoda; __Hexapoda; __Collembola; __Sminthuridae; __Sminthuridae_environmental_sample
    denovo20076 0.0 1.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta; __Metazoa; __Nematoda; __Enoplea; __Qudsianematidae
    denovo22655 1.0 0.0 0.0 0.0 0.0 0.0 Eukaryota; __Opisthokonta;         __Metazoa; __Rotifera; __Philodinidae; __uncultured_bdelloid_rotifer 

如果文件 (a) 和 (b) 中的字段 1 匹配,我想将文件 (a) 的字段 2 打印到文件 (b) 的字段 9。

我在 Whosebug 上查找过类似的解决方案,例如https://unix.stackexchange.com/questions/140275/match-first-fields-of-two-tab-separated-files-and-print-matching-values,但无法领养。

我的 AWK 尝试完全失败了,我没有接近解决方案。然而,我能够在 Excel 中做到这一点,但这只有在文件足够小的情况下才有可能:

  =INDEX('18S'!B:B2189,(MATCH(phylotypes!A3:A174,'18S'!A:A2189,0)))

我为所需的 return 值索引文件 (a) 的第二个字段,然后在文件 (b) 的第一个字段中定义查询值并将它们与文件 (a) 中的相应值匹配.“0”确保 "denovo" 之间的精确匹配 - 字段 1 中的字符串。此外,当查询值更改时,“$”符号可防止 return 值中的 "slipping"。

如果文件较大,那么 Excel AWK 或 BASH 允许的 ~1 000 000 行会更好。

亲切的问候,

保罗

你可以看到这个awk:

awk 'BEGIN{FS=OFS="\t"} FNR==NR{a[]=; next} {for (i in a) if ( ~ i) print [=10=], a[i]}' fileA fileB

工作原理:

  • BEGIN{FS=OFS="\t"} - 将输入和输出字段分隔符设为制表符
  • FNR==NR - 仅对 fileA 执行此块
  • {a[]=; next} - 创建一个关联数组a,键为</code>,值为<code>,然后跳到下一条记录
  • {...} - 为第二个输入文件执行此块
  • for (i in a) 迭代数组 a
  • if ( ~ i) 如果数组中的关键部分匹配 fileB
  • 中的 </code> <li><code>print [=25=], a[i] - 打印来自 fileB 的整个记录​​和来自数组 的值