Unix 打印最频繁的行并删除重复项
我一直在尝试打印最频繁的行,并删除一个大文件中由tab分隔的键值的重复项,第一个字段中有许多不同的值 输入示例:Unix 打印最频繁的行并删除重复项,unix,awk,Unix,Awk,我一直在尝试打印最频繁的行,并删除一个大文件中由tab分隔的键值的重复项,第一个字段中有许多不同的值 输入示例: a|gofortheeyeboo 0.61 a|gofortheeyeboo 0.81 a|gofortheeyeboo 0.81 a|gofortheeyeboo 0.81 a|gofortheeyeboo 0.81 a|gofortheeyeboo 0.81 a|gofortheeyeboo 0.91 a|gofortheeyeboo-g
a|gofortheeyeboo 0.61
a|gofortheeyeboo 0.81
a|gofortheeyeboo 0.81
a|gofortheeyeboo 0.81
a|gofortheeyeboo 0.81
a|gofortheeyeboo 0.81
a|gofortheeyeboo 0.91
a|gofortheeyeboo-gone 0.07
a|gofortheeyeboo-gone 0.07
a|gofortheeyeboo-abouttogone 0.61
a|gofortheeyeboo-abouttogone 0.12
b|attaack-attack 0.07
不同键的所需输出:
a|gofortheeyeboo 0.81
a|gofortheeyeboo-gone 0.07
a|gofortheeyeboo-abouttogone 0.61
a|gofortheeyeboo-abouttogone 0.12
b|attaack-attack 0.07
到目前为止,管理了在第二个制表符分隔的字段中获取最大值的输出,通过删除重复项
awk -F '\t' '{ if (l[$1] <= $2) l[$1] = $2} END {for (i in l) print i"\t"l[i];}'
试试
uniq
和head
怎么样?这是一个大的文本文件。不幸的是,不是关于boo。
a|gofortheeyeboo 0.91
a|gofortheeyeboo-abouttogone 0.61
b|attaack-attack 0.07
a|gofortheeyeboo-gone 0.07
sort input | uniq -c | sort -nr | \
awk 's[$2] == $1 { print $2,$3} !s[$2] { print $2,$3; s[$2]=$1; }'
keys = {}
for line in sys.stdin:
line = line.strip()
k, v = line.split('\t')
if k in keys:
if v in keys[k]:
keys[k][v] += 1
else:
keys[k][v] = 1
else:
keys[k] = {v: 1}
for k in keys:
items = keys[k].items()
# Some pair emerged more than once
if any(map(lambda x: x[1] > 1, items)):
# Calucalte max frequence
freq = reduce(
lambda acc, e: acc if acc[1] > e[1] else e,
items
)[0]
print '{0}\t{1}'.format(k, freq)
# None pair emereged more than once
else:
# Print every pair
for v in items:
print '{0}\t{1}'.format(k, v[0])