我给出了一个包含多个网址的数据集,如:
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
答案 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