2014-09-04 77 views
0

想基於第2列,行項目數,第3列和大約100個InputTest文件第一column.Having的獨特價值,而不是總和排序打印.. 現在用下面3個命令來實現所需的輸出,想知道最簡單的方法...awk來計數總和和獨特的提高指揮

InputTest * .TXT

abc,xx,5,sss 
abc,yy,10,sss 
def,xx,15,sss 
def,yy,20,sss 
abc,xx,5,sss 
abc,yy,10,sss 
def,xx,15,sss 
def,yy,20,sss 
ghi,zz,10,sss 

第1步:

cat InputTest*.txt | awk -F, '{key=$2;++a[key];b[key]=b[key]+$3} END {for(i in a) print i","a[i]","b[i]}' 

運算#1

xx,4,40 
yy,4,60 
zz,1,10 

步驟#2

awk -F ',' '{print $1,$2}' InputTest*.txt | sort | uniq >Op_UniqTest2.txt 

運算#2

abc xx 
abc yy 
def xx 
def yy 
ghi zz 

步驟#3

awk '{print $2}' Op_UniqTest2.txt | sort | uniq -c 

運算#3

2 xx 
2 yy 
1 zz 

所需的輸出:

xx,4,40,2 
yy,4,60,2 
zz,1,10,1 

尋找的建議!

回答

1
BEGIN { FS = OFS = "," } 
{ ++lines[$2]; if (!seen[$2,$1]++) ++diff[$2]; count[$2]+=$3 } 
END { for(i in lines) print i, lines[i], count[i], diff[i] } 
  • lines每當一個獨特的組合被發現跟蹤列中的第二和第一列的2個
  • seen記錄唯一組合,遞增diff[$2]每個值的出現的次數。 seen[$2,$1]++意味着,情況只會是真正的第一次組合被發現,由於看到了價值[$ 2,$ 1]將增至1!看到[$ 2,$ 1]將是錯誤的。
  • count保持總第三列
$ awk -f avn.awk file 
xx,4,40,2 
yy,4,60,2 
zz,1,10,1 
+0

非常感謝湯姆·芬內克,其做工精細! – VNA 2014-09-05 05:35:58

1

使用awk的:

$ awk ' 
BEGIN { FS = OFS = "," } 
{ keys[$2]++; sum[$2]+=$3 } !seen[$1,$2]++ { count[$2]++ } 
END { for(key in keys) print key, keys[key], sum[key], count[key] } 
' file 
xx,4,40,2 
yy,4,60,2 
zz,1,10,1 

設置輸入和輸出字段分隔符,BEGIN塊。我們使用數組keys來識別和計數密鑰。 sum數組保留每個鍵的總和。 count允許我們跟蹤獨特COLUMN1爲每列2的值。

+1

非常感謝Jaypal,它的工作很好! – VNA 2014-09-05 05:37:51