如果文件 (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
的整个记录和来自数组 的值
在 post
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
的整个记录和来自数组 的值