统计规则如下:
a c 1 意思为: 第一列的名称中 a 与 c 在第二列的金额 相等的 记录有 1个. ( 注 根据文件中 第1行记录和第3行记录 得到的结果)
b c 2 意思为: 第一列的名称中 b 与 c 在第二列的金额 相等的 记录有 2个. ( 注 根据文件中 第2,3行记录和第5,6行记录 得到的结果)
作者: dahaoshanhe 时间: 2013-01-05 17:31
没看明白是下面这个意思不?
先把文件复制一下 cp f1 f2
awk '{a[$1]++;b[$1,a[$1]-1]=$2;a[$1]>m?m=a[$1]:m=m}0END{for(i in a) for (j in a) for(k=0;k<=m;k++)if( i!=j && b[i,k]==b[j,k] && b[i,k]!="") printf "%s\t%s\t%s\n",i,j,b[j,k]}' urfile\
|awk '{a[$1" "$2]++}END{for(i in a)print i" "a[i]}'
复制代码
写完已经大小便失禁,生活不能自理了,求高手简化。
如果没有理解错你的意思的话结果应该是,跟你期望的结果稍有偏差,感觉你给的答案是不对的。比如:b d 都有111和222,所以应该是 b d 2
a b 1
a c 1
a d 1
b a 1
b c 2
b d 2
c a 1
c b 2
c d 2
d a 1
d b 2
d c 2
awk '{a[$1];b[$2];c[$1""$2]}END{for(i in a){for(j in a){if(i!=j){for(k in b){if((i""k in c)&&(j""k in c))n++}print i,j,n;n=""}}}}'
复制代码
运行结果如下:
[root@localhost ~]# cat i
a 111
b 111
c 111
d 111
b 222
c 222
d 222
[root@localhost ~]# awk '{a[$1];b[$2];c[$1""$2]}END{for(i in a){for(j in a){if(i!=j){for(k in b){if((i""k in c)&&(j""k in c))n++}print i,j,n;n=""}}}}' i