1チャンネルのすべてのパターンをgrepして印刷します。

1チャンネルのすべてのパターンをgrepして印刷します。

次のパターンのリストを含むファイルがあります。

K00001

K00003

K00005

タブで区切られたテーブルをgrepして、次のようにパターンを印刷したいです(元のテーブルには空白行はありません)。

K00001  ko00010_Glycolysis__Gluconeogenesis

K00003  ko00010_Glycolysis__Gluconeogenesis

K00005  ko00010_Glycolysis__Gluconeogenesis

K00001  ko00020_Citrate_cycle_(TCA_cycle)

K00003  ko00020_Citrate_cycle_(TCA_cycle)

K00005  ko00020_Citrate_cycle_(TCA_cycle)

これを得る:1行に私のパターンファイルのすべてのパターンが含まれています。

K00001_ko00010_Glycolysis__Gluconeogenesis;K00001_ko00020_Citrate_cycle_(TCA_cycle)
K00003_ko00010_Glycolysis__Gluconeogenesis;K00003_ko00020_Citrate_cycle_(TCA_cycle)
K00005_ko00010_Glycolysis__Gluconeogenesis;K00005_ko00020_Citrate_cycle_(TCA_cycle)

答え1

ソリューションは以下を使用します。アッ。 2つのファイル名を引数として渡し、if (FNR == NR)イディオムを使用して最初のファイルを読み取るのか2番目のファイルを読み取るかに応じて、別の操作を実行します。私たちは使用します連想配列ボタンと出力ラインを保存します。

ファイルは次のとおりですa.awk

# usage: awk -f a.awk keyfile1 datafile2
BEGIN {
    FS = "\t"                               # set field separator to TAB
}
{
    if (FNR == NR) {                        # if looking at first (key) file
        k[$1]=$1                            # just save each key
    } else {                                # if looking at second file
        if ($1 in k) {                      # if first col is one that we want
            output=$1 "_" $2                # prepare output line
            if (out[$1]=="")                # if first time we've seen this key
                out[$1]=output              # store output as is
            else                            # and when we find more matches for this key
                out[$1]=out[$1] ";" output  # we append ";" and the output
        }
    }
}
END {                                       # at the end
    for (i in out)                          # print all the output lines
        print out[i]
}

使用方法は次のとおりです。

$ awk -f a.awk file1 file2
K00001_ko00010_Glycolysis__Gluconeogenesis;K00001_ko00020_Citrate_cycle_(TCA_cycle)
K00003_ko00010_Glycolysis__Gluconeogenesis;K00003_ko00020_Citrate_cycle_(TCA_cycle)
K00005_ko00010_Glycolysis__Gluconeogenesis;K00005_ko00020_Citrate_cycle_(TCA_cycle)

関連情報