1

我有 1M个 fasttext 格式的词向量(忽略包含词汇大小和暗淡的第一行)。每行是一个单词,后跟 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 解决方案是保留一个存储每个单词的小写字母的字典,并根据该字典检查每一行的单词,但我对 awk/sed(甚至 grep)解决方案感到好奇。

4

2 回答 2

3

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

awk '!a[tolower($1)]++' wiki-news-300d-1M.vec
于 2021-06-23T23:22:24.360 回答
3

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

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

这和@Barmar 的 awk 解决方案之间的区别在于:

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