linux - 数据列的总和(个位数)

原文 标签 linux bash gnu-coreutils

我正在寻找一种快速添加行数据的方法,如

3333456332....
3334456332....
3343446332....
3331355332....

(但更长)并将其按位数相加:
12 12 13 11 15 19 22 12 12 4

只有一个班轮可以吗?还是更复杂?

最佳答案

一点好的锥子怎么样:

awk -v FS="" '{for(i=1; i<=NF; ++i) a[i]+=$i} END {for (i=1; i<=NF; ++i) printf "%d ", a[i] }' file

这将创建一个数组a,它累加每个数字的所有和。在文件的END处,遍历数组并打印所有和。
FS变量在这里很重要,因为它意味着行上的每个数字都被视为一个单独的字段。
输出:
12 12 13 11 15 19 23 12 12 8

更新
上面的代码不会在和之后打印换行符,这可能是您想要的。正如fedorqui在评论中所建议的,一种方法是:
awk -v FS="" '{for (i=1; i<=NF; ++i) a[i]+=$i} END {for (i=1; i<=NF; ++i) printf "%d%s", a[i], (i<NF?" ":"\n") }' file

它在所有值之间打印一个空格,然后在末尾打印一个换行符。
或者,如果您喜欢连接字符串,可以执行以下操作:
awk -v FS="" '{for(i=1; i<=NF; ++i) a[i]+=$i} END{for (i=1; i<=NF; ++i) s=s a[i] " "; print s}' file

它首先建立一个字符串s,然后prints它。print将默认为您添加换行符。
choroba's answer启发,这里有一个使用perl的替代版本:
perl -F'' -wane 'pop @F; $i=0; $s[$i++]+=$_ for @F }{ print "@s\n"' file

在awk中,将字段分隔符设置为''。使用“autosplit”开关-a创建数组@F,每个元素包含一个数字。
@F的最后一个元素是换行符"\n",因此pop会删除它。数组@s保持所有和。-n开关意味着整个命令被包围在while (<>) { ... }中,因此使用}{“爱斯基摩操作员”可以有效地创建一个END块。通过将特殊变量$"设置为空格$"默认情况下是空格,因此可以一次性打印数组,每个元素由空格分隔。

相关文章:

c - 有没有办法在Linux中使用C以编程方式设置接口MTU?

c++ - 尝试使用g ++编译目标文件时出现“-std = c ++ 11:command not found”错误

bash - bash获取第一场awk grep

linux - 使用tac反向读取文件

bash - 使用sudo运行延迟的命令

linux - 修复fstab(只读/)

linux - 您如何开始实现线程库?

macos - psql:找不到命令Mac

bash - 输入目录时是否可以自动进行一些Shell调用?

bash - 列出iOS 5.0.1中的所有进程