リストに文字列があることを確認し、文字列がある場合は3番目のファイルを出力します。

リストに文字列があることを確認し、文字列がある場合は3番目のファイルを出力します。

2つのファイル(「data.tab」と「mylist.tab」)があります。

私の "data.tab"ファイルは次のとおりです。

Info_1    abc1     abc2     abc3
Info_2    abc5     ghi4
Info_3    abc10
Info_4    abc8     abc7     abc87    klm78    abc99
Info_5    

私の "mylist.tab"ファイルは次のとおりです。

abc2
abc10
abc34
abc99
abc78
abc8
abc3
abc5
abc4

「data.tab」のすべての文字列(最初の列を除く)が「mylist.tab」にあるかどうかを検索したいと思います。文字列が存在する場合は、その行/列に「1」が含まれ、それ以外の場合は「0」になる3番目のファイル「output.tab」を作成したいと思います。

例: "output.tab"

Info_1   0    1     1
Info_2   1    0
Info_3   1
Info_4   1    0     0    0    1
Info_5   

「data.tab」には、行ごとに異なる数の列が含まれています。

ベストアンサー1

これはawkを使って直接表現できます。

awk 'FNR==NR { h[$1]; next } { for(i=2; i<=NF; i++) $i = ($i in h)? 1 : 0 } 1' mylist.tab data.tab

またはより読みやすい形式で:

解析.awk

# Collect mylist.tab into the `h` associative array
FNR==NR {
  h[$1]
  next
}

# For all but the first column in data.tab check and record if it is in `h`
{ 
  for(i=2; i<=NF; i++) 
    $i = ($i in h) ? 1 : 0 
}

# Short for { print $0 }
1

次のように実行します。

awk -f parse.awk mylist.tab data.tab

出力:

Info_1 0 1 1
Info_2 1 0
Info_3 1
Info_4 1 0 0 0 1
Info_5

またはタブで区切られた列の場合:

awk -v OFS='\t' -f parse.awk mylist.tab data.tab

出力:

Info_1  0   1   1
Info_2  1   0
Info_3  1
Info_4  1   0   0   0   1
Info_5

おすすめ記事