次のテキストがあります。 (単語、単語フィールド)
car transport
car machine
bank economy
bank politics
bank parks
God religion
...
多くの単語があり、いくつかの単語は異なるドメインを持ち、いくつかの単語はドメインが1つしかありません。次のように、各単語の単語とベクトルで構成される巨大な行列(1行あたり300次元)の別のファイルがあります。
bank 0.9 1.5 3.2 -0.2 0.1 ...
God 1.0 2.1 -0.5 0.7 ...
rose 0.2 -1.8 ...
... ...
最初のファイルから各単語の発生回数を読み取り、その値に基づいて2番目のファイルの各ベクトルで最も高い「n」数を選択し、その単語が属するフィールドを知りたいです。このような:
car 2
bank 3
God 1
この数字
bank 4 3.2
bank 3 1.5
bank 2 0.9
God 3 2.1
私が最初に考えた部分
gawk 'NR==FNR {a[$1]++;next;} dont know what here?' list matrix
少し複雑であることを知っていますが、助けてくれてありがとう。たぶん他の方法が簡単になりますか?
ベストアンサー1
awk '
NR==FNR{ #operate matrix file first
A[$1] = 1 #array of words
for(i=2;i<=NF;i++)
B[$1 OFS i] = $i #array with indexes [word field_num]
next
}
$1 in A{ #if word in array A
max = $1 OFS 2
for(i in B)
if(i ~ "^" $1 && B[max] < B[i])
max = i #find maximum in B-array
print max, B[max] #output word + field_num + value
delete B[max] #exclude value from next search
}
}
' matrix list
awk バージョンが擬似多次元配列を受け入れると、スクリプトが簡素化される可能性があります。
awk '
NR==FNR{
for(i=2;i<=NF;i++)
A[$1][i] = $i
next
}
$1 in A{
max = 2
for(i in A[$1])
if(A[$1][max] < A[$1][i])
max = i
print $1, max, A[$1][max]
delete A[$1][max]
}
}
' matrix list