使用awk将矩阵转换为值对

使用awk将矩阵转换为值对,awk,Awk,我有一个包含经纬度和温度的数据矩阵,格式如下: 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

我有一个包含经纬度和温度的数据矩阵,格式如下:

            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 one liner(可能有点长):


awk'NR==1{for(i=1;i解决方案不需要复杂。一旦选择了正确的数据结构,它实际上相当简单。只需使用
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"
            }
        }
    }
}
或者,这里有一个班轮:

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

awk'NR==1{for(i=1;i
awk'NR==1{n=split($0,a,“”)}NR!=1{for(i=1;我知道,它工作得很好。非常感谢。我想我可能对awk有点生疏,但即使在我最好的时候,这也不是我的能力范围。有一件事我忘了,一些温度值是错误的,它们是999.9,我想忽略这些,你知道在哪里插入if吗?@PRN你可以添加一个“if”结束块中的语句,例如如果v[t[i],r[j]]<范围,然后打印。如果您无法解决此问题,请在您的问题中添加新条件,我可以更新我的答案。这就足够了,非常感谢您的帮助。非常感谢Steve,这种方法似乎也很有效,而且已经包括了对错误数据的识别,所以也要感谢您。
awk -f script.awk file
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
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
>