微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据重复的第一个单词删除行,忽略大小写

如何解决根据重复的第一个单词删除行,忽略大小写

我在 fasttext format (ignoring the first line containing vocab size and dim) 中有 1M 个词向量。每行是一个单词,后跟 300 个数字,所有空格分隔,例如。

Word 1.00 0.50 -2.30
WORD 0.90 0.40 -2.20

如何保留单词出现的第一行,忽略大小写,并删除所有其他行?例如,由于Word最先出现,WORD行被删除输出

Word 1.00 0.50 -2.30

我可以使用 tr '[:upper:]' '[:lower:]' < wiki-news-300d-1M.vec 将所有单词转换为小写,但这会破坏单词的大小写。如果包括数字在内的整行都匹配,我知道如何删除所有重复的行,但这在这里没有用。我的 Python 解决方案是保留一个 dict 存储每个单词的小写字母,并根据该 dict 检查每一行的单词,但我对 awk/sed(甚至 grep)解决方案感到好奇。

解决方法

使用 tolower($1) 作为 awk 中数组的键。

awk '!a[tolower($1)]++' wiki-news-300d-1M.vec
,

使用 GNU sort for -s 进行“稳定排序”并假设不需要保留原始行顺序:

$ sort -k1,1 -fsu file
Word 1.00 0.50 -2.30

这和@Barmar's awk solution的区别在于:

  1. awk 解决方案可以使用任何 awk,而排序需要 GNU sort 以确保打印第一个副本。
  2. awk 解决方案将保留输入行顺序,而排序将按字母顺序生成输出。
  3. awk 解决方案会比 sort 解决方案慢。
  4. awk 解决方案对于比排序文件更小(但仍然很大)的输入文件会耗尽内存。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。