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

标签 linux awk sed

我有两个文本文件:

文件 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

但我没有得到想要的输出。任何人都可以纠正/帮助吗?

最佳答案

您可以使用以下 awk 脚本来完成此操作:

脚本.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 block 将制表符设置为分隔符。
  • 针对第一个参数 (File-2) 执行 NR == FNR block :它读取带有名称的疾病,拆分名称,然后附加疾病到字典中的每个名字下
  • 最后一个 block 仅针对第二个参数 (File-1) 执行(由于前一个 block 中的 next):它输出存储的疾病名字下(取自$1)

关于Linux - 搜索文件中的文本并加入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218609/

相关文章:

bash - 如何在 bash 中打印文件末尾的第 n 行?

linux - Postfix 无法从文件/etc/ssl/private/server.key : disabling TLS support 中获取 RSA 私钥

linux - 忽略 find 命令中的目录

unix - 每行打印一个字

linux - 转换 key :value to CSV file

bash - 使用 AWK 搜索并替换为 2 个单独的文件

regex - sed 用特殊字符替换字符串

linux - 从左侧和右侧删除文本并将字符串保留在中间

linux - 如何从 cli 输出中删除 '^[[2K' 序列?

linux - BASH getopts 具有相同选项的多个脚本