一种方式与awk
:
$ awk '{a[$2 OFS $3]+=$1}END{for(k in a)print a[k],k}' file
1 Chr1 100821817
1 Chr1 100821818
1 Chr1 100820415
5 Chr1 100824427
1 Chr1 100824428
1 Chr1 100823536
一种方式与python
:
$ cat cluster.py
#!/usr/bin/env python
import fileinput
cluster = {}
for line in fileinput.input():
field = line.strip().split()
try:
cluster[' '.join(field[1:])] += int(field[0])
except KeyError:
cluster[' '.join(field[1:])] = int(field[0])
for key, value in cluster.items():
print value, key
使脚本可执行chmod +x cluster.py
和运行,如:
$ ./cluster.py file
1 Chr1 100823536
1 Chr1 100821817
1 Chr1 100820415
5 Chr1 100824427
1 Chr1 100824428
1 Chr1 100821818
这两种方法都利用哈希表在这里使用相同的技术。使用awk
我们使用关联数组和python字典。简单地说,两者都是数组,其中的键不是数字,而是字符串(第二和第三列值)。一个简单的例子:
blue 1
blue 2
red 5
blue 1
red 2
如果说awk '{a[$1]+=$2}' file
然后我们得到如下:
Line Array Value Explanation
1 a["blue"] 1 # Entry in 'a' is created with key $1 and value $2
2 a["blue"] 3 # Add $2 on line 2 to a["blue"] so the new value is 3
3 a["blue"] 3 # The key $1 is red so a["blue"] does not change
a["red"] 5 # Entry in 'a' is created with new key "red"
4 a["blue"] 4 # Key "blue", Value 1, 1 + 3 = 4
a["red"] 5 # Key "blue", so a["red"] doesn't change
5 a["blue"] 4 # Key "red", so a["blue"] doesn't change
a["red"] 7 # Key "red", Value 2, 5 + 2 = 7
你应该张贴你到目前为止试过了,还是你有一个具体的问题,而不仅仅是人们要解决的问题。 – Gray
awk'BEGIN {x + = $ 1} END {print x} if NF == $ 2'file_name – user2464553
我是awk的新手,试图理解物流,但是我无法说“如果$ 2是相同的,如果$ 2是相同的,那么增加$ 3的值(如果$ 3的值相同)对不起,作为一个免费的加载程序来临! – user2464553