2

我有一个格式如下的文件:

a 1 2 3 4
b 7 8
c 120

我希望它被解析为:

a 10
b 15
c 120

我知道这可以用 awk 轻松完成,但我不熟悉语法,无法让它为我工作。

谢谢你的帮助

4

4 回答 4

5

好的简单的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 介绍

于 2013-01-18T11:10:48.423 回答
3

从第二列开始并添加它们:

 awk '{tot=0; for(i=2;i<$NF;i++) tot+=$i; print $1, tot;}' file
于 2013-01-18T11:05:09.360 回答
3

一个纯粹的 bash 解决方案:

$ while read f1 f2
> do
>   echo $f1 $((${f2// /+}))
> done < file

在运行它时,得到:

a 10
b 15
c 120

第一个字段被读入变量f1,其余字段是 i f2。在 variablef2中,空格被替换为+并评估。

于 2013-01-18T11:11:45.810 回答
0

这是使用子外壳、位置参数和 IFS 的一种棘手方法。适用于字段之间的不同数量的空白。

while read label numbers; do 
    echo $label $(set -- $numbers; IFS=+; bc <<< "$*")
done < filename

这是有效的,因为外壳扩展"$*"成一个位置参数字符串,由$IFS( documentation )的第一个字符连接

于 2013-01-18T20:55:05.680 回答