我有一个格式如下的文件:
a 1 2 3 4
b 7 8
c 120
我希望它被解析为:
a 10
b 15
c 120
我知道这可以用 awk 轻松完成,但我不熟悉语法,无法让它为我工作。
谢谢你的帮助
好的简单的awk入门:
awk '{ for (i=2;i<=NF;i++) { total+=$i }; print $1,total; total=0 }' file
NF 是一个内部变量,它在每一行都被重置并且等于该行上的字段数,所以
for (i=2;i<=NF;i++) 从 2 开始一个 for 循环
total+=$i 表示 var total 具有添加到其中的第 i 个字段的值。并为上述循环的每次迭代执行。
print $1,total 打印第一个字段,后跟 OFS 变量的内容(默认为空格),然后是该行的总计。
total=0 重置为下一次迭代准备的总计 var。
以上所有内容都是在每一行输入上完成的。
有关更多信息,请参见此处的 grymoires 介绍
从第二列开始并添加它们:
awk '{tot=0; for(i=2;i<$NF;i++) tot+=$i; print $1, tot;}' file
一个纯粹的 bash 解决方案:
$ while read f1 f2
> do
> echo $f1 $((${f2// /+}))
> done < file
在运行它时,得到:
a 10
b 15
c 120
第一个字段被读入变量f1
,其余字段是 i f2
。在 variablef2
中,空格被替换为+
并评估。
这是使用子外壳、位置参数和 IFS 的一种棘手方法。适用于字段之间的不同数量的空白。
while read label numbers; do
echo $label $(set -- $numbers; IFS=+; bc <<< "$*")
done < filename
这是有效的,因为外壳扩展"$*"
成一个位置参数字符串,由$IFS
( documentation )的第一个字符连接