bash - 如何使用 shell、bash、awk、sed 在稀疏矩阵中插入零元素

标签 bash sed awk sparse-matrix

我需要在 Matrix Market 中的任何稀疏矩阵中插入零元素格式(但已经没有标题)。

第一列是ROW的编号,第二列是COLUMN的编号,第三列是元素的VALUE。

我正在使用 2 x 3 矩阵对其进行测试。但我需要能够对任何维度矩阵 m x n 执行此操作。

每个矩阵的行数、列数和非零元素已经在单独的变量中。

到目前为止,我一直使用 bash sed 和 awk 处理这些矩阵。

输入文件:

1 1 1.0000
1 2 2.0000
2 1 4.0000
2 2 5.0000
2 3 6.0000

ROWS 和 COLUMNS 是整数 %d,VALUES 是 float %.4f

这里只有一个元素为零(第 1 行第 3 列),代表它的行被省略。

那么,我该如何插入这一行???

输出文件:

1 1 1.0000
1 2 2.0000
1 3 0.0000
2 1 4.0000
2 2 5.0000
2 3 6.0000

一个空的 2 x 3 矩阵应该是这样的:

1 1 0.0000
1 2 0.0000
1 3 0.0000
2 1 0.0000
2 2 0.0000
2 3 0.0000

另一个例子,一个有更多零元素的 3 x 4 矩阵。

输入文件:

1 2 9.7856
1 4 4.2311
2 1 3.4578
2 2 45.1231
2 3 -12.0124
3 4 0.1245

输出文件:

1 1 0.0000
1 2 9.7856
1 3 0.0000
1 4 4.2311
2 1 3.4578
2 2 45.1231
2 3 -12.0124
2 4 0.0000
3 1 0.0000
3 2 0.0000
3 3 0.0000
3 4 0.1245

我希望你能帮助我。我已经花了 3 天多的时间来尝试解决方案。

我得到的最好的是这个:

for((i=1;i<3;i++))
do
    for((j=1;j<4;j++))
    do
        awk -v I=${i} -v J=${j} 'BEGIN{FS=" "}
                            {if($1==I && $2==J)
                                    printf("%d %d %.4f\n",I,J,$3)
                            else
                                    printf("%d %d %d\n",I,J,0)
                            }' ./etc/A.2
        done
done

但它效率不高,会打印很多不需要的行:

1 1 1.0000
1 1 0
1 1 0
1 1 0
1 1 0
1 2 0
1 2 2.0000
1 2 0
1 2 0
1 2 0
1 3 0
1 3 0
1 3 0
1 3 0
1 3 0
2 1 0
2 1 0
2 1 4.0000
2 1 0
2 1 0
2 2 0
2 2 0
2 2 0
2 2 5.0000
2 2 0
2 3 0
2 3 0
2 3 0
2 3 0
2 3 6.0000

拜托!帮我!谢谢大家!

最佳答案

如果要指定最大“I”和“J”值:

# cat tst.awk
{ a[$1,$2] = $3 }
END {
    for (i=1;i<=I;i++)
        for (j=1;j<=J;j++)
            print i, j, ( (i,j) in a ? a[i,j] : "0.0000" )
}

$ awk -v I=2 -v J=3 -f tst.awk file
1 1 1.0000
1 2 2.0000
1 3 0.0000
2 1 4.0000
2 2 5.0000
2 3 6.0000

如果您希望该工具能够解决问题(不适用于空文件,或者如果最大期望值从未被填充):

$ cat tst2.awk
NR==1 { I=$1; J=$2 }

{
    a[$1,$2] = $3
    I = (I > $1 ? I : $1)
    J = (J > $2 ? J : $2)
}

END {
    for (i=1;i<=I;i++)
        for (j=1;j<=J;j++)
            print i, j, ( (i,j) in a ? a[i,j] : "0.0000" )
}

$ awk -f tst2.awk file
1 1 1.0000
1 2 2.0000
1 3 0.0000
2 1 4.0000
2 2 5.0000
2 3 6.0000

关于bash - 如何使用 shell、bash、awk、sed 在稀疏矩阵中插入零元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18039274/

相关文章:

bash - 如何使用 bash 更新文件行?

shell - 将每隔一行与下一行连接起来

mysql - Linux SED AWK Sqlite 转储到 MySQL 将以 create table 开头的行上的字符串更改为 varchar

linux - 在特定列中查找具有共同值的行

linux - 如何从 Bash 中的这个 "while read"循环中获取值?

bash - sed:使用另一个文件的内容修改一个文件

linux - 用于查找第 n 次出现的字符串并打印行号的 shell 脚本

php - 在运行服务时写入带有日期的日志文件

bash - 用****屏蔽输出卡号

regex - 删除新行,除非前面有特定字符集