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"
}