【问题标题】:grep based on first columngrep 基于第一列
【发布时间】:2014-05-11 11:19:01
【问题描述】:

我有一个名为 fileA 的大数据文件,格式如下

col1    0.1111,0.2222,0.33333,0.4444
col5    0.1111,0.2222,0.33333,0.4444
col3    0.1111,0.2222,0.33333,0.4444
col4    0.1111,0.2222,0.33333,0.4444

第 1 列和第 2 列之间的分隔符是 \t。其他分隔符是逗号。 我有另一个包含我感兴趣的行名称的文件,称为 fileB,它看起来像:

col3
col1
...

两个文件都没有排序。我想从 fileA 中检索名称出现在 fileB 中的所有行。代码grep -f fileB fileA 完成了这项工作,但我认为它会搜索fileA 中的所有文件,这需要很长时间。如何指定只搜索 fileA 中的第一列?

【问题讨论】:

  • 看看join命令。从那里我认为你可以解决它。

标签: linux grep


【解决方案1】:
join <(sort -t $'\t' -k 1 fileA) <(sort -t $'\t' -k 1 fileB)

文件在 O(n.log(n)+p.log(p)) 中排序,然后在 O(n+p) 中合并,我认为我们不能做得比这更好。

编辑好的,我们可以使用 O(n+p) 的哈希表做得更好。

【讨论】:

    【解决方案2】:

    没有排序的线性时间 O(n) 解。 (我没有测试,希望没有错字):

    awk -F'\t' 'NR==FNR{a[$0]=7;next}a[$1]' fileB fileA
    

    请注意,哈希表上的get 操作被视为O(1)

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 2022-07-22
      • 2014-05-24
      • 1970-01-01
      • 2016-05-06
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多