すべての列のすべての一意の値を一意の識別子に置き換えます。

すべての列のすべての一意の値を一意の識別子に置き換えます。

250,000行と10列のファイルがあります。たとえば、次のようになります。

img1 aa bb cc ...
img2 aa yy dd ...
img3 uu bb ee ...
img4 NA bb tt ...

このファイルを次に変換するスクリプトが必要です。

img1 1 1 1 ...
img2 1 2 2 ...
img3 2 1 3 ...
img4 0 1 4 ...

最初の列以降、各列の一意の値は、ゼロから始まる一意の識別子で置き換える必要があります。ここで、0 は文字列 "NA" 用に予約されています。

また、各列に対してマッピングを含むファイルを生成したいと思います。たとえば、ファイルの2番目の列は次のようになります。

NA 0
aa 1
uu 2

誰でもこれに対する優雅な解決策を提案できますか?どんな助けでも大変感謝します。

ベストアンサー1

これは非常に簡単な方法です。これはgawk 3.1.7ではうまくいきます。

#!/usr/bin/awk -f
{
    for(x=2;x<=NF;x++) {
        if(x$x in a) {
            $x=a[x$x]
        } else {
            if($x=="NA") {
                print $x,0 > "column"x
                a[x$x]=0
                $x="0"
            } else {
                m[x]++
                print $x,m[x] > "column"x
                a[x$x]=m[x]
                $x=m[x]
            }
        }
    }
    print $0 > "results"
}

おすすめ記事