【问题标题】:How to print output from both files matched on one column?如何打印在一列上匹配的两个文件的输出?
【发布时间】:2019-01-09 08:26:15
【问题描述】:

我有两个文件

 >vi cc4
163489921       ENSG00000145416
163490721       ENSG00000145416
163493030       ENSG00000145416
163494582       ENSG00000145416
163498263       ENSG00000145416
163506833       ENSG00000145416
163510223       ENSG00000145416
...

>vi bed_chr_4.bed
chr4    171975321       171975322       rs230   0       -
chr4    10204223        10204224        rs231   0       +
chr4    184363210       184363211       rs232   0       -
chr4    39547490        39547491        rs529   0       +
chr4    109740780       163489921       rs551   0       -
chr4    25929702        25929703        rs554   0       +
chr4    17624034        17624035        rs555   0       +
...

我想对 cc4 的第 1 列和 bed_chr_4.bed 的第 3 列进行匹配,并打印来自 bed_chr_4.bed 的匹配行以及来自 cc4 的匹配的第 2 列。我想为这个样本得到的输出是:

chr4    109740780       163489921       rs551   0       -     ENSG00000145416

我试过这个:

awk 'NR==FNR{a[$1]=$1;next}a[$3]{print $0}' cc4 bed_chr_4.bed >outfile

但我只从 bed_chr_4.bed 获得 6 列匹配,而不是从 cc4 获得第二列,在这种情况下是:ENSG00000145416

我只得到这个:

chr4    109740780       163489921       rs551   0       - 

【问题讨论】:

  • 您需要使用 awk 还是可以在脚本中使用其他工具(即 grep)?

标签: bash awk


【解决方案1】:

你快到了。问题是您将$1 分配给a[$1]。 请改用:

awk 'NR==FNR{a[$1]=$2;next} a[$3]{print $0 " " a[$3]}' cc4 bed_chr_4.bed > outfile

准确地说,它依赖于假设 cc4 的第二个字段持有一个值 这被评估为真实。说起来可能更安全:

awk 'NR==FNR{a[$1]++;b[$1]=$2;next} a[$3] {print $0 " " b[$3]}' cc4 bed_chr_4.bed > outfile

【讨论】:

  • 完美!非常感谢您的澄清。
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 2018-08-08
  • 2018-07-12
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2018-08-08
  • 2021-06-26
相关资源
最近更新 更多