使用awk制作稀疏矩阵

时间:2016-02-15 11:51:01

标签: bash matrix text awk editing

我无法将大型2D矩阵格式化为“稀疏矩阵”格式。我希望这里有人可以提供帮助。

由于文件较大,应首选 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 = rownames的数字部分(colomn1来自数据;例如:0,5000,1000); Column2 =是组合名称的相应数字部分(例如: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

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

谢谢, 的Laszlo

1 个答案:

答案 0 :(得分:0)

编辑:现在为输入行中的多个“点击”输出单独的行

$ 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($1, 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