首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果(a)和(b)文件中的fields1匹配,则将文件(a)的字段2打印到文件(b)的字段9

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

Stack Overflow用户
提问于 2015-01-31 09:00:20
回答 1查看 61关注 0票数 0

在post Deduplicate two column file based on minimum value in column 2 AWK / BASH中,我请求帮助生成这样的文件(a):

代码语言:javascript
复制
denovo0  90.2
denovo1  97.7
denovo10     93.8
denovo100    95.3

第二个文件(b)具有这样的结构(8列,选项卡分开):

代码语言:javascript
复制
    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。

我在StackOverflow上查找过类似的解决方案,例如https://unix.stackexchange.com/questions/140275/match-first-fields-of-two-tab-separated-files-and-print-matching-values,但未能采用它们。

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

代码语言:javascript
复制
  =INDEX('18S'!B$1:B$692189,(MATCH(phylotypes!A3:A174,'18S'!A$1:A$692189,0)))

我将文件(a)的第二个字段索引为所需的返回值,然后在文件(b)的第一个字段中定义查询值,并将它们与文件(A)中的相应值(a).The "0“匹配,确保字段1中的”新“字符串之间完全匹配。此外,当查询值发生变化时,"$”符号防止返回值的“滑动”。

如果文件更大,那么Excel或BASH允许的1000行行会做得更好。

致以亲切的问候,

保罗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-31 12:50:07

你可以看到这个awk

代码语言:javascript
复制
awk 'BEGIN{FS=OFS="\t"} FNR==NR{a[$1]=$2; next} {for (i in a) if ($1 ~ i) print $0, a[i]}' fileA fileB

的工作方式:

  • BEGIN{FS=OFS="\t"} -使输入和输出字段分隔符作为选项卡
  • FNR==NR -只为fileA执行此块
  • {a[$1]=$2; next} -创建一个键为$1,值为$2的关联数组a,然后跳到下一个记录。
  • {...} -为第二个输入文件执行这个块
  • for (i in a)迭代数组a
  • 如果数组中的关键部分与if ($1 ~ i)中的$1匹配,则为fileB
  • print $0, a[i] -从fileB打印整个记录和从数组打印值
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28249904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档