我有一个csv文件,
value name date sentence
0000 name1 date1 I want apples
0021 name2 date1 I want bananas
0212 name3 date2 I want cars
0321 name1 date3 I want pinochio doll
0123 name1 date1 I want lemon
0100 name2 date1 I want drums
1021 name2 date1 I want grape
2212 name3 date2 I want laptop
3321 name1 date3 I want Pot
4123 name1 date1 I want WC
2200 name4 date1 I want ramen
1421 name5 date1 I want noodle
2552 name4 date2 I want film
0211 name6 date3 I want games
0343 name7 date1 I want dvd
我想在名称选项卡中找到唯一值(我知道我必须使用-f 2,但是我还想知道它们出现多少次/做出的句子数量。
eg: name1,5
name2,3
name3,2
name4,2
name5,1
name6,1
name7,1
然后,我想再记录一次每次出现的人数
1 appearance, 3
2 appearance ,2
3 appearance ,1
4 appearance ,0
5 appearance ,1
答案 0 :(得分:1)
第一部分的答案是在下面使用awk
awk -F" " 'NR>1 { print $2 } ' jerome.txt | sort | uniq -c
对于第二部分,您可以将其通过Perl传输,并获得如下结果
> awk -F" " 'NR>1 { print $2 } ' jerome.txt | sort | uniq -c | perl -lane '{$app{$F[0]}++} END {@c=sort keys %app; foreach($c[0] ..$c[$#c]) {print "$_ appearance,",defined($app{$_})?$app{$_}:0 }}'
1 appearance,3
2 appearance,2
3 appearance,1
4 appearance,0
5 appearance,1
>
EDIT1:
第二部分使用Perl单缸纸
> perl -lane '{$app{$F[1]}++ if $.>1} END {$app2{$_}++ for(values %app);@c=sort keys %app2;foreach($c[0] ..$c[$#c]) {print "$_ appearance,",$app2{$_}+0}}' jerome.txt
1 appearance,3
2 appearance,2
3 appearance,1
4 appearance,0
5 appearance,1
>
答案 1 :(得分:0)
您所追求的是在管道中结合一组Linux核心工具的经典示例:
这解决了您的第一个问题:
$ awk '(NR>1){print $2}' file | sort | uniq -c
5 name1
3 name2
2 name3
2 name4
1 name5
1 name6
1 name7
这解决了您的第二个问题:
$ awk '(NR>1){print $2}' file | sort | uniq -c | awk '{print $1}' | uniq -c
1 5
1 3
2 2
3 1
您会注意到格式略有缺失,但这从根本上解决了您的问题。
当然可以在awk中一口气做到这一点,但是我相信您应该尝试理解以上内容。看一下man sort
和man uniq
。 awk解决方案是:
问题1:
awk '(NR>1){a[$2]++}END{ for(i in a) print i "," a[i] }' file
name6,1
name7,1
name1,4
name2,3
name3,2
name4,2
name5,1
问题2:
awk '(NR>1){a[$2]++; m=(a[$2]<m?m:a[$2])}
END{ for(i in a) c[a[i]]++;
for(i=1;i<=m;++i) print i, "appearance,", c[i]+0
}' foo.txt
1 appearance, 3
2 appearance, 2
3 appearance, 1
4 appearance, 0
5 appearance, 1
答案 2 :(得分:0)
对于第一份报告,您可以使用:
tail -n +2 file | awk '{print $2}' | sort | uniq -c
5 name1
3 name2
2 name3
2 name4
1 name5
1 name6
1 name7
对于第二份报告,您可以使用:
tail -n +2 file | awk '{print $2}'| sort | uniq -c | awk 'BEGIN{max=0} {map[$1]+=1; if($1>max) max=$1} END{for(i=1;i<=max;i++){print i" appearance,",(i in map)?map[i]:0}}'
1 appearance, 3
2 appearance, 2
3 appearance, 1
4 appearance, 0
5 appearance, 1
此处的复杂性是由于您想要在输出中使用0
和自定义文本appearance
。