【问题标题】:Removing lines based on duplicate first word, ignoring case根据重复的第一个单词删除行,忽略大小写
【发布时间】:2021-09-07 11:41:57
【问题描述】:

我在fasttext format (ignoring the first line containing vocab size and dim) 中有 100 万个词向量。每行是一个单词,后跟 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)解决方案感到好奇。

【问题讨论】:

  • 由于此问题中存在awk 解决方案,并且标签应与答案一致,因此在此处标记awk

标签: awk fasttext unix-text-processing


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 2019-10-17
    • 1970-01-01
    • 2019-06-24
    • 2023-02-02
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多