使用awk拆分列,计算出现次数

时间:2013-04-03 16:06:03

标签: count awk split

我有一个输入文件:

type   count
"apples, oranges, bananas"   3  
oranges   5  
"apples, bananas"   10  
"oranges, bananas"   2

我正在尝试计算文件中的苹果,橙子和香蕉的总数(第一列是逗号分隔的)。因此输出应该类似于:

apples   13  
oranges   10  
bananas   15  

我无法想出一个简单的awk表达式来总结拆分列的独特元素。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您根据当前格式更改了输入文件至少两次:

$ cat -t file
type^Icount
"apples, oranges, bananas"^I3
oranges^I5
"apples, bananas"^I10
"oranges, bananas"^I2

注意:cat -t会将文件中的标签显示为^I

这个脚本可以完成这项工作:

$ awk -F'\t' 'NR>1{gsub(/"/,"");n=split($1,s,/, /);for(i=1;i<=n;i++)a[s[i]]+=$2}END{for(k in a) print k,a[k]}' file
apples 13
bananas 15
oranges 10

答案 1 :(得分:1)

这是使用GNU awk实现它的一种方法:

<infile awk -v FS='["\t ,]+' '
NR>1 {
  for(i=1; i<NF; i++)
    if(length($i)>0)
      h[$i] += $NF
}

END { for(k in h) print k, h[k] }'

输出:

apples 13
bananas 15
oranges 10

请注意,您可能需要在输入到达awk之前删除尾随空格:

<infile sed 's/[\t ]*$//' | awk -v FS='["\t ,]+' '
NR>1 { 
  for(i=1; i<NF; i++) 
    if(length($i)>0) 
      h[$i] += $NF
} 

END { for(k in h) print k, h[k] }'