如何按顺序打印包含某些字符串的行?

时间:2016-07-05 01:14:03

标签: linux bash awk

我有两个文件

档案indv

COPDGene_P51515
COPDGene_V67803
COPDGene_Z75868
COPDGene_U48329
COPDGene_R08908
COPDGene_E34944

档案data

    COPDGene_Z75868  1   
    COPDGene_A12318  3
    COPDGene_R08908  5
    COPDGene_P51515  8
    COPDGene_U48329  2
    COPDGene_V67803  8
    COPDGene_E34944  2
    COPDGene_D29835  9

我想按照indv的顺序打印indv中包含字符串的行,如下所示

COPDGene_P51515  8
COPDGene_V67803  8
COPDGene_Z75868  1
COPDGene_U48329  2
COPDGene_R08908  5
COPDGene_E34944  2

我尝试使用

awk 'NR==FNR{a[$1]++;next} ($1 in a)' indv data

但我得到了

        COPDGene_Z75868  1   
        COPDGene_R08908  5
        COPDGene_P51515  8
        COPDGene_U48329  2
        COPDGene_V67803  8
        COPDGene_E34944  2

不是indv的顺序。

2 个答案:

答案 0 :(得分:4)

$ awk 'FNR==NR{a[$1]=$0;next;} {print a[$1]}' data indv
COPDGene_P51515  8
COPDGene_V67803  8
COPDGene_Z75868  1
COPDGene_U48329  2
COPDGene_R08908  5
COPDGene_E34944  2

如何运作

  • FNR==NR{a[$1]=$0;next;}

    对于第一个文件读取数据,在第一个字段a的索引下保存关联数组$1中的每一行。跳过其余命令,然后从next行重新开始。

  • print a[$1]

    如果我们到这里,我们正在处理第二个文件,indv。对于此文件,从与此行上第一个字段对应的数据中打印每一行。这样,每行的内容由数据控制,但打印顺序由indv控制。

答案 1 :(得分:3)

awk 'FNR==NR{a[$1]=$2;next} a[$1]{print $1,a[$1]}' data indv
COPDGene_P51515 8
COPDGene_V67803 8
COPDGene_Z75868 1
COPDGene_U48329 2
COPDGene_R08908 5
COPDGene_E34944 2

优点:只有第二个字段存储在内存中,而不是数据中的完整记录。它不会尝试从indv中打印没有数据匹配的记录。

缺点:如果这些行不是唯一的,它将只保留数据中的最后一个条目。