我有这种格式的文件
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”字
感谢
亚历
答案 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%纯bash溶液(剩余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
<强>代码强>
如果您希望添加数字
paste -d''Input1.txt Input2.txt | awk -F“”'{print $ 1“”$ 2“”$ 3 + $ 6}'
如果您希望在数字之间打印“+”,请
paste -d''Input1.txt Input2.txt | awk -F“”'{print $ 1“”$ 2“”$ 3“+”$ 6}“