【问题标题】:Making sparse matrix using awk使用 awk 制作稀疏矩阵
【发布时间】:2016-02-15 11:51:00
【问题描述】:

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

由于文件很大,应该首选 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 = 行名的数字部分(数据中的第 1 列;例如: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

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

谢谢, 拉兹洛

【问题讨论】:

  • 您说您遇到了麻烦——您尝试过什么,特别遇到了什么麻烦?

标签: bash matrix text awk editing


【解决方案1】:

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

$ 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

【讨论】:

  • 我确信我们可以做到这一点,但我不确定你的意思。编辑您的问题以显示示例输入和演示此要求的所需输出。
  • 非常感谢!有用!但是,如何在每次点击后添加新行?因此,基于该示例,它可以完美运行,但是如果一行有多个“命中”,它会将这些命中打印在一行中。我想在新行中打印每个命中。我编辑了代码的 printf 部分(现在它在新行中打印命中,但没有 column1 信息,并在切换到下一个元素后留下一个空行)
  • 编辑您的问题以包含至少一些具有多次点击的示例数据并显示所需的输出。
  • link 这里附上结果。基本上我只想填充空的 column1 值。 (如 0,0,0,40000,40000,40000,40000 等)
  • 格式化在 cmets 中不起作用。编辑原始问题本身。您的样本数据和所需的输出需要考虑多次命中的可能性。否则,新来的人(今天或从今天起一年后)不会完全了解需要做什么(我没有)或答案真正解决了什么问题。
猜你喜欢
  • 2018-01-19
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-11-25
相关资源
最近更新 更多