从不同的输入文件中添加数字

时间:2013-06-15 15:17:08

标签: bash

我有这种格式的文件

A yield 123
B yield 345
C yield 165

和另一个类似的

A yield 456
B yield 5675
C yield 34534

如何在bash中添加所有输入文件中的数字列?

A yield 123+456

但A,B,C是有点复杂的字符串,可能包含符号等,但在这些和数字之间始终存在“yield”字

感谢

亚历

4 个答案:

答案 0 :(得分:3)

对于awk来说,这是一个很好的问题:

awk 'NR==FNR{a[$1]=$0;next}{print a[$1]"+"$NF}' file1 file2

稍微强健一点:

awk -F' yield ' '{a[$1]=($1 in a)?a[$1]"+"$2:$2}END{for(i in a)print i" yield "a[i]}' file1 file2

awk 'BEGIN{FS=OFS=" yield "}{a[$1]=($1 in a)?a[$1]"+"$2:$2}END{for(i in a)print i,a[i]}' file1 file2 

如果你真的不需要+,你可以使用join

join -11 -21 -o1.1,1.2,1.3,2.3 file1 file2

这有点简单但更脆弱(需要对文件进行排序;如果需要,您可以将file1替换为<(sort file1),将2替换为{。

答案 1 :(得分:1)

如果您在两者之间打印+的数字,那么您可以使用Kevin's个答案中的任何一个。

但是,如果您希望真正add他们,那么以下内容应该有效:

awk 'NR==FNR{a[$1$2]=$3;next}{$NF=$NF+a[$1$2]}1' file1 file2

答案 2 :(得分:0)

99%纯溶液(剩余1%为cat)。使用关联数组:

#!/bin/bash
declare -A a;

while read -r n y b; do
    [[ $y = yield ]] && a[$n]+=${a[$n]:++}$b
done < <(cat file1 file2)

for i in "${!a[@]}"; do
    echo "$i yield ${a[$i]}"
done

如果您有大文件,它会变慢。在这种情况下,请使用其他答案中给出的awk方法。

如果某一行在第二个位置不包含单词yield,则会被忽略。

答案 3 :(得分:0)

尝试这个(如果有帮助)...简单使用粘贴和awk

<强> Input1.txt

A yield 123
B yield 345
C yield 165

<强> Input2.txt

A yield 456
B yield 5675
C yield 34534

<强>代码

  1. 如果您希望添加数字

    paste -d''Input1.txt Input2.txt | awk -F“”'{print $ 1“”$ 2“”$ 3 + $ 6}'

  2. 如果您希望在数字之间打印“+”,请

    paste -d''Input1.txt Input2.txt | awk -F“”'{print $ 1“”$ 2“”$ 3“+”$ 6}“