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

时间:2015-01-31 09:00:21

标签: excel bash shell awk

在帖子Deduplicate two column file based on minimum value in column 2 AWK / BASH中,我已经请求帮助生成这样的文件(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。

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

我的AWK尝试完全失败了,我没有接近解决方案。但是我能够在Excel中执行此操作,但只有在文件足够小时才能执行此操作:

  =INDEX('18S'!B$1:B$692189,(MATCH(phylotypes!A3:A174,'18S'!A$1:A$692189,0)))

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

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

亲切的问候,

1 个答案:

答案 0 :(得分:4)

您可以查看此awk

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} - 创建关键数组a,关键字为$1,值为$2,然后跳至下一条记录
  • {...} - 为第二个输入文件执行此块
  • for (i in a)迭代数组a
  • if ($1 ~ i)如果数组中的关键部分与$1
  • 中的fileB匹配
  • print $0, a[i] - 打印fileB的整个记录​​和数组
  • 的值