我在Unix中的编码技能有限,所以我正在寻求帮助。
我有两个文件进入:
文件1:
列名
密钥计数
68150 500
68220 300
68448 200
68778 500
file2的:
68150 53
68171 6
68448 18
68778 05
68993 13
我需要的是: 1 - 2个文件之间所有唯一键的单个记录。 2 - 密钥匹配的位置将计数字段加在一起。
输出文件:
68150 553
68171 6
68220 300
68448 215
68778 505
68993 13
我看过一个'加入' ' COMM' ' DIFF'和'排序'命令,它们似乎不是我需要的。
答案 0 :(得分:-1)
在bash
中,这应该有效(假设输入文件为/tmp/file1
和/tmp/file2
)
join -a 1 -a 2 <(sort -b /tmp/file1) <(sort -b /tmp/file2) | while read a b c; do
echo $a $((${b:-0} + ${c:-0}))
done
让我一步一步解释:
首先,我们必须加入这些行(并通过传递-a 1 -a 2
而不删除任何不匹配的记录)
$ join -a 1 -a 2 <(sort -b /tmp/file1) <(sort -b /tmp/file2)
68150 500 53
68171 6
68220 300
68448 200 18
68778 500 05
68993 13
然后,我们可以使用read a b c
逐行阅读所有内容,因此第一列将位于$a
中,第二列位于$b
中,第三列位于$c
中。我们必须解决的最后一个问题是它可能只有两列而不是三列,但在bash中这很容易:如果非空,${c:-0}
将评估为$c
并且默认值为{{ 1}}否则。
哦,使用0
我们可以进行计算。最终输出:
$(( expr ))