Linux - 在文件中搜索文本并加入另一个文件

时间:2016-05-13 20:09:46

标签: linux awk sed

我有两个文本文件:

File-1

PRKCZ
TNFRSF14
PRDM16
MTHFR  

File-2(包含两个制表符分隔的列):

atherosclerosis   GRAB1|PRKCZ|TTN
cardiomyopathy,hypercholesterolemia    PRKCZ|MTHFR
Pulmonary arterial hypertension,arrhythmia   PRDM16|APOE|GATA4  

现在,对于File-1中的每个名称,还会打印匹配的File-2中相应的疾病名称。所以输出将是:

PRKCZ    atherosclerosis,cardiomyopathy,hypercholesterolemia
PRDM16    Pulmonary arterial hypertension,arrhythmia
MTHFR    cardiomyopathy,hypercholesterolemia  

我试过了代码:

$ awk '{k=$1}
        NR==FNR{if(NR>1)a[k]=","b"="$1";else{a[k]="";b=$1}next}
        k in a{print $0a[k]}' File1 File2

但我没有获得所需的输出。请有人纠正/帮助。

1 个答案:

答案 0 :(得分:3)

您可以使用以下awk脚本执行此操作:

script.awk

BEGIN { FS="[\t]" }
NR==FNR { split($2, tmp, "|")
          for( ind in tmp ) {
            name = tmp[ ind ]
            if (name in disease) { disease[ name ] = disease[ name ] "," $1 }
            else { disease[ name ] = $1 }
          }
          next
        }

        { if( $1 in disease) print $1, disease[ $1 ] }

awk -f script.awk File-2 File-1一样使用它(请先注意File-2)。

<强>解释

  • BEGIN块将标签设置为分隔符。
  • 为第一个参数(NR == FNR)执行File-2块:它读取带有名称的疾病,拆分名称,然后将疾病附加到每个名称下的字典
  • 第二个参数(next)仅执行最后一个块(由于前一个块中的File-1):它输出存储在名称下的疾病(取自{{ 1}})