3

次の形式の緯度経度と気温のデータのマトリックスがあります。

            15W     14.5W   14W     13.5W   13W 
30N         19.3    19.3    19.2    18.9    18.6
30.5N       19.1    19      19      18.9    18.4
31N         18.9    18.8    18.7    18.6    18.3
31.5N       18.9    18.7    18.7    18.6    18.1
32N         18.6    18.5    18.6    18.5    17.5

awkを使用して、緯度経度と気温の線に変換したいと思います。出力は次のようになります。

15W 30N 19.3 
15W 30.5N 19.1 
15W 31N 18.9 
15W 31.5N 18.9 
15W 32N 18.6
14.5W 30N 19.3
14.5W 30.5N 19
14.5W 31N 18.8

私はあなたがその考えを理解していると思います。awkについて他のことをしたことがあり、非常に強力だったので、awkについて考えました。ただし、ここでは他のツールを使用することもできます。

行と列の数は必ずしも同じではありません。

また、緯度と経度を小数分に変換する必要がありますが、一度に1ステップずつ実行しています。

4

3 に答える 3

4

awkワンライナー(多分少し長いかもしれません):

 awk 'NR==1{for(i=1;i<=NF;i++)t[i]=$i}{ r[NR]=$1; for(i=2;i<=NF;i++) v[t[i-1],$1]=$i}END{for(i=1;i<=length(t);i++) for(j=2;j<=NR;j++) print t[i], r[j], v[t[i],r[j]]
} ' file

上記のワンライナーを「スリーライナー」にフォーマットしたい:):

 awk 'NR==1{for(i=1;i<=NF;i++)t[i]=$i}
        { r[NR]=$1; for(i=2;i<=NF;i++) v[t[i-1],$1]=$i}
        END{for(i=1;i<=length(t);i++)for(j=2;j<=NR;j++)print t[i], r[j], v[t[i],r[j]]} ' file

テスト:

kent$  cat t
            15W     14.5W   14W     13.5W   13W 
30N         19.3    19.3    19.2    18.9    18.6
30.5N       19.1    19      19      18.9    18.4
31N         18.9    18.8    18.7    18.6    18.3
31.5N       18.9    18.7    18.7    18.6    18.1
32N         18.6    18.5    18.6    18.5    17.5

kent$  awk 'NR==1{for(i=1;i<=NF;i++)t[i]=$i}
        { r[NR]=$1; for(i=2;i<=NF;i++) v[t[i-1],$1]=$i}
        END{for(i=1;i<=length(t);i++)for(j=2;j<=NR;j++)print t[i], r[j], v[t[i],r[j]]} ' t
15W 30N 19.3
15W 30.5N 19.1
15W 31N 18.9
15W 31.5N 18.9
15W 32N 18.6
14.5W 30N 19.3
14.5W 30.5N 19
14.5W 31N 18.8
14.5W 31.5N 18.7
14.5W 32N 18.5
14W 30N 19.2
14W 30.5N 19
14W 31N 18.7
14W 31.5N 18.7
14W 32N 18.6
13.5W 30N 18.9
13.5W 30.5N 18.9
13.5W 31N 18.6
13.5W 31.5N 18.6
13.5W 32N 18.5
13W 30N 18.6
13W 30.5N 18.4
13W 31N 18.3
13W 31.5N 18.1
13W 32N 17.5
于 2013-01-27T20:16:43.313 に答える
2

ソリューションは複雑である必要はありません。適切なデータ構造を選択すれば、実際にはかなり簡単です。GNU awk真の多次元配列を使用するために使用するだけです。次のように実行します:

awk -f script.awk file

内容script.awk

NR==1 {
    for (i=1;i<=NF;i++) {
        a[i]=$i
    }
    next
}

{
    for (j=2;j<=NF;j++) {
        b[j-1][NR]["rec"] = a[j-1] FS $1 FS $j
        b[j-1][NR]["val"] = $j
    }
}

END {
    for (x=1;x<=length(b);x++) {
        for (y=2;y<=NR;y++) {

            if (b[x][y]["val"] != "999.9") {

                print b[x][y]["rec"] | "column -t"
            }
        }
    }
}

結果:

15W    30N    19.3
15W    30.5N  19.1
15W    31N    18.9
15W    31.5N  18.9
15W    32N    18.6
14.5W  30N    19.3
14.5W  30.5N  19
14.5W  31N    18.8
14.5W  31.5N  18.7
14.5W  32N    18.5
14W    30N    19.2
14W    30.5N  19
14W    31N    18.7
14W    31.5N  18.7
14W    32N    18.6
13.5W  30N    18.9
13.5W  30.5N  18.9
13.5W  31N    18.6
13.5W  31.5N  18.6
13.5W  32N    18.5
13W    30N    18.6
13W    30.5N  18.4
13W    31N    18.3
13W    31.5N  18.1
13W    32N    17.5

または、これがワンライナーです。

awk 'NR==1 { for (i=1;i<=NF;i++) a[i]=$i; next } { for (j=2;j<=NF;j++) { b[j-1][NR]["rec"] = a[j-1] FS $1 FS $j; b[j-1][NR]["val"] = $j } } END { for (x=1;x<=length(b);x++) for (y=2;y<=NR;y++) if (b[x][y]["val"] != "999.9") print b[x][y]["rec"] | "column -t" }' file
于 2013-01-28T08:23:46.940 に答える
1
awk 'NR==1{n=split($0,a," ")}NR!=1{for(i=1;i<=n;i++)x[a[i]" "$1]=$(i+1);}END{for(i in x){print i,x[i]}}' temp | sort

以下でテスト済み:

> cat temp
            15W     14.5W   14W     13.5W   13W 
30N         19.3    19.3    19.2    18.9    18.6
30.5N       19.1    19      19      18.9    18.4
31N         18.9    18.8    18.7    18.6    18.3
31.5N       18.9    18.7    18.7    18.6    18.1
32N         18.6    18.5    18.6    18.5    17.5
phoenix.250> nawk 'NR==1{n=split($0,a," ")}NR!=1{for(i=1;i<=n;i++)x[a[i]" "$1]=$(i+1);}END{for(i in x){print i,x[i]}}' temp | sort
13.5W 30.5N 18.9
13.5W 30N 18.9
13.5W 31.5N 18.6
13.5W 31N 18.6
13.5W 32N 18.5
13W 30.5N 18.4
13W 30N 18.6
13W 31.5N 18.1
13W 31N 18.3
13W 32N 17.5
14.5W 30.5N 19
14.5W 30N 19.3
14.5W 31.5N 18.7
14.5W 31N 18.8
14.5W 32N 18.5
14W 30.5N 19
14W 30N 19.2
14W 31.5N 18.7
14W 31N 18.7
14W 32N 18.6
15W 30.5N 19.1
15W 30N 19.3
15W 31.5N 18.9
15W 31N 18.9
15W 32N 18.6
>
于 2013-01-28T13:03:09.193 に答える