使用awk制作稀疏矩阵

Making sparse matrix using awk

我无法将大型二维矩阵格式化为 "sparse matrix" 格式。我希望这里有人可以提供帮助。

由于文件较大,最好使用 awk 脚本。

这是来自数据的假设集(制表符分隔):

Regions      string8-0      string8-5000      string8-10000
string8-0        0                2.1                1.15    
string8-5000     0                0                  2.4  
string8-10000    0                4                  3.1

因此,结果输出应该是一个包含四列的制表符分隔文件。 Column1 = 行名的数字部分(来自数据的 colomn1;示例:0、5000、1000); Column2 = colnames 的相应数字部分(例如:0、5000、10000),Column3 = 两个 bin 之间的值。 Column4 = 列名称的字符串部分(string8、string8、string8)。

并且仅当对应值不为零时才打印。

像这样:

0      5000    2.1    string8
0      10000   1.15   string8
5000   10000   2.4    string8
10000  5000    4      string8
10000  10000   3.1    string8

对不起,如果这是一个多余的问题,但我找不到任何解决方案。

谢谢, 拉斯洛

编辑:现在为输入行

中的多个"hits"输出单独的行
$ cat sp.awk
BEGIN { FS = OFS = "\t" }

NR == 1 {
    for (c=2; c<=NF; ++c) {
        split($c, col_parts, "-")
        col_str[c] = col_parts[1]
        col_num[c] = col_parts[2]
    }
    next
}

{
    split(, parts, "-");
    col1 = parts[2]
    for (c=2; c<=NF; ++c) {
        if ($c != 0) {
            print col1, col_num[c], $c, col_str[c]
        }
    }
}

$ awk -f sp.awk sp.txt
0       5000    2.1     string8
0       10000   1.15    string8
5000    10000   2.4     string8
10000   5000    4       string8
10000   10000   3.1     string8