2013-11-27 18 views
0

的值的字段的一次出现我有一个制表符分隔的表像下面计数给定的另一场

402 Tea Bags 4 
403 Tea Bags 4 
404 Tea Bags 3 
405 Milk 3 
406 Sugar 4 
407 Sugar 3 
408 Sugar 4 
409 Milk 4 
410 Milk 3 
411 Milk 3 

我想要计算给定的第三字段的条件第二场的发生之一。实施例号茶包的发生时第三字段是3和4.Like当

$3==4 && $2=="Tea Bags"; count ++ 

可以有第三字段多于两个数和在第二列3级以上的选项。

然后,我想最终其列为

Tea Bags 4 2 
Tea Bags 3 1 
Milk 3 3 
Milk 4 1 
Sugar 4 2 
Sugar 3 1 

我可以用

awk -F "\t" '{for(i=1; i<=NF; i++) 
    if(($i=="Tea Bags" && ($(i+1)==3))) c++ } 
    END{ print c }' file.txt 

不过,我想单独计算它们在awk中应该有一个更短的和有效的方式来做到这一点因为我有一个非常大的文件。谢谢!!

+0

当你说'有可能在第三场超过两个号码,并在第二column.'超过3个选项,你的意思是有第二场比第三场(牛奶,茶叶袋和糖)更多的可能性,你已经显示,同样,第三列有超过两个可能性比你已经显示的两个(3和4)可能吗? –

+0

第二个字段中的选项数永远不会大于第三个。 – discipulus

回答

1

这个怎么样AWK一行代码:

awk '{sub(/\S*\t/,"");a[$0]++}END{for(x in a)print x, a[x]}' file 
+0

谢谢,但我怎么能安排这样两个牛奶走到一起。下一个项目仅在第一个项目的计数完成后才启动? – discipulus

+1

@lovedynasty最简单的方法是将输出传递给'sort' – Kent

1

这是做你想做的吗?

BEGIN {FS="\t"; OFS="\t"} 

{a[$2,$3]++} 

END { 
    for (k in a) { 
     split(k, p, SUBSEP) 
     print p[1], p[2], a[k] 
    } 
} 

替代地写入(以避免分流/ SUBSEP)

BEGIN {FS="\t"; OFS="\t"} 

{a[$2 OFS $3]++} 

END { 
    for (k in a) { 
     print k, a[k] 
    } 
} 
1

使用此awk命令:

awk -F "\t" '{k=$2 FS $3; if (!(k in a)) s[j++]=k; a[k]++} 
      END {for (i=0; i<length(s); i++) print s[i], a[s[i]]}' OFS="\t" file 

Tea Bags  4  2 
Tea Bags  3  1 
Milk 3  3 
Sugar 4  2 
Sugar 3  1 
Milk 4  1 
0

使用关联数组一个bash溶液:

declare -A count 

while IFS=$'\t'; read col1 col23 ; do 
    ((count[$col23]++))     # use col 2 and 3 as key 
done < "$infile" 

for key in "${!count[@]}"; do 
    echo -e "$key\t${count[$key]}" 
done 

输出:

Tea Bags 4 2 
Tea Bags 3 1 
Sugar 4 2 
Sugar 3 1 
Milk 4 1 
Milk 3 3