次のパターンのリストを含むファイルがあります。
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)