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