使用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
我无法将大型二维矩阵格式化为 "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