テキスト処理(2つのファイルの読み取りと計算)[awk、スクリプト]

テキスト処理(2つのファイルの読み取りと計算)[awk、スクリプト]

次のテキストがあります。 (単語、単語フィールド)

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

おすすめ記事