【问题标题】:Sum each element of a row from two files将两个文件中一行的每个元素相加
【发布时间】:2016-03-12 11:09:18
【问题描述】:

我想编写一个 shell 脚本,在其中添加来自 file1 和 file2 的每一行的列元素。

file1:

A 10 12 13 14
B 2 5 6 10
C 1

file2:

A 11 13 11 15
B 3 1 1 1
C 2

output:

A 22 25 24 29
B 5 6 7 11
C 3

我试过写这个,但看起来很混乱。 所以我想得到一些帮助,让它变得更好!

awk '{getline v < "file1"; split( v, a ); 
        for (i = 2; i <= NF; i++) 
            {print a[1], a[i]+ $i}
        }' file2 > temp

awk '{a[$1]=a[$1]" "$2}
    END{for(i in a)print i,a[i]
    }' temp > out

【问题讨论】:

  • 欢迎来到 Stack Overflow!发布的所有内容都是程序说明。但是,我们需要您ask a question。我们无法确定您想从我们这里得到什么。请edit您的帖子包含一个我们可以回答的有效问题。提醒:请确保您知道what is on-topic here,请我们为您编写程序,建议是题外话。
  • 欢迎来到 Stack Overflow!请edit您的帖子包含您对问题的任何其他信息。避免在 cmets 中添加它,因为它们更难阅读并且更容易删除。帖子的编辑按钮就在帖子标签的下方。

标签: linux shell


【解决方案1】:

文件1

A 10 12 13 14
B 2 5 6 10
C 1

文件2

A 11 13 11 15
B 3 1 1 1
C 2

节目

cat file1 file2 | cut -d" " -f1 | sort -u | while read i
do
  line1="`grep ^$i file1 | sed -e "s/  */ /g" | cut -d" " -f2-` "
  line2="`grep ^$i file2 | sed -e "s/  */ /g" | cut -d" " -f2-` "
  (
  echo $i
  while [ "${line1}${line2}" != "" ]
  do
    v1=0`echo "$line1" | cut -d" " -f1`
    v2=0`echo "$line2" | cut -d" " -f1`
    line1="`echo "$line1" | cut -d" " -f2-`"
    line2="`echo "$line2" | cut -d" " -f2-`"
    echo `expr $v1 + $v2`
  done
  ) | xargs
done > file3

文件3

A 21 25 24 29
B 5 6 7 11
C 3

如果列数或行数不相同,此解决方案仍然有效,缺失值被视为 0

#file1
A 10 12 13 14
B 2 5 6
C 1 10
D 1 1

#file2
A 11 13 11 15
B 3 1 1 1 5
C 2
F 3 3

#file3
A 21 25 24 29
B 5 6 7 1 5
C 3 10
D 1 1
F 3 3

【讨论】:

  • 非常感谢。 . .. 这是一个非常优雅的解决方案! !!
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多