如何统计网址中的单词

时间:2014-11-23 10:56:31

标签: unix awk sed grep

我给出了一个包含多个网址的数据集,如:

http://dbpedia.org/resource/Duncan_Trussell
http://dbpedia.org/resource/Ruth_Mary_Reynolds
http://dbpedia.org/resource/Abbas_Noyan
http://dbpedia.org/resource/John_E._Dowdell
http://dbpedia.org/resource/John_F._Du

基本上,我需要制作一个显示人名的脚本,结果应该是这样的:

First name
John 2
Abbas 1
Duncan 1
Ruth 1

Last Name
Trussels 1
Reynolds 1
Noyan 1
Dowdell 1
Du 1

4 个答案:

答案 0 :(得分:1)

grep -Po 'resource/\K[^_]*(?=_)' urls.txt | uniq -c | awk '{print $2" "$1}'

输出:

Duncan 1
Ruth 1
Abbas 1
John 2

grep -Po '_\K[^_]*$' urls.txt | uniq -c | awk '{print $2" "$1}'

输出:

Trussell 1
Reynolds 1
Noyan 1
Dowdell 1
Du 1

<小时/> 如果您愿意,可以将| uniq -c | awk '{print $2" "$1}'替换为| awk '{count[$1]++}END{for(j in count) print j, count[j]}'

答案 1 :(得分:0)

全部在awk中 拆分_上的最后一个字段 使用关联数组增加拆分的第一个和最后一个字段 然后在最后只打印名称及其各自的计数。

awk -F/ '{t=split($NF,a,"_");b[a[1]]++;c[a[t]]++}
         END{print "Firstnames";for(i in b)print i,b[i]
             print "\nLastnames";for(j in c) print j,c[j]
          }' test

输出

Firstnames
Duncan 1
Ruth 1
John 2
Abbas 1

Lastnames
Noyan 1
Du 1
Trussell 1
Reynolds 1
Dowdell 1

答案 2 :(得分:0)

这是另一个awk

awk -F"/|_" '{a[$5]++;b[$NF]++} END {for (i in a) print i,a[i];print "";for (i in b) print i,b[i]}' file
Duncan 1
Ruth 1
John 2
Abbas 1

Noyan 1
Du 1
Trussell 1
Reynolds 1
Dowdell 1

这应该比多重命令grep uniq awk

快得多

答案 3 :(得分:0)

使用GNU awk实现真正的二维数组:

$ gawk -F'/' '
{
    nr = split($NF,names,/_/)
    cnt["First"][names[1]]++
    cnt["Last"][names[nr]]++
}
END {
    for (pos in cnt) {
        print pos, "name"
        for (name in cnt[pos]) {
            print name, cnt[pos][name]
        }
    }
}
' file
Last name
Noyan 1
Du 1
Trussell 1
Reynolds 1
Dowdell 1
First name
Duncan 1
Ruth 1
John 2
Abbas 1