2

我有这种格式的文件

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

4 回答 4

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

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

于 2013-06-15T15:48:41.097 回答
1

如果您要打印+介于两者之间的数字,那么您可以选择凯文的任何一个答案。

但是,如果您希望真正做到这一点add,那么以下应该可以工作:

awk 'NR==FNR{a[$1$2]=$3;next}{$NF=$NF+a[$1$2]}1' file1 file2
于 2013-06-15T17:18:11.133 回答
0

一个 99% 的纯解决方案(剩下的 1% 是 a 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第二个位置的单词,它会被忽略。

于 2013-06-15T17:41:16.600 回答
0

试试这个(如果有帮助的话)...简单使用 paste 和 awk

输入1.txt

A yield 123
B yield 345
C yield 165

Input2.txt

A yield 456
B yield 5675
C yield 34534

代码

  1. 如果您希望添加数字

    粘贴 -d ' ' Input1.txt Input2.txt | awk -F""'{打印$1""$2""$3+$6}'

  2. 如果您只想在数字之间打印“+”号

    粘贴 -d ' ' Input1.txt Input2.txt | awk -F " " '{打印 $1 " " $2 " " $3"+"$6}'

于 2013-06-15T21:27:52.173 回答