我有这种格式的文件
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”字
谢谢
亚历克斯
我有这种格式的文件
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”字
谢谢
亚历克斯
这是一个很好的问题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)
和相同)。
如果您要打印+
介于两者之间的数字,那么您可以选择凯文的任何一个答案。
但是,如果您希望真正做到这一点add
,那么以下应该可以工作:
awk 'NR==FNR{a[$1$2]=$3;next}{$NF=$NF+a[$1$2]}1' file1 file2
一个 99% 的纯bash解决方案(剩下的 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
第二个位置的单词,它会被忽略。
试试这个(如果有帮助的话)...简单使用 paste 和 awk
输入1.txt
A yield 123
B yield 345
C yield 165
Input2.txt
A yield 456
B yield 5675
C yield 34534
代码
如果您希望添加数字
粘贴 -d ' ' Input1.txt Input2.txt | awk -F""'{打印$1""$2""$3+$6}'
如果您只想在数字之间打印“+”号
粘贴 -d ' ' Input1.txt Input2.txt | awk -F " " '{打印 $1 " " $2 " " $3"+"$6}'