【问题标题】:Extract rows in file where a column value is included in a list?提取文件中列值包含在列表中的行?
【发布时间】:2016-11-25 01:11:21
【问题描述】:

我有一个巨大的数据文件:

datatable.txt

id1 england male
id2 germany female
... ... ...

我还有另一个数据列表:

indexes.txt

id1
id3
id6
id10
id11

我想从 datatable.txt 中提取 ID 包含在 indexes.txt 中的所有行。

是否可以使用 awk/sed/grep 执行此操作?文件太大,用R或python不太方便。

【问题讨论】:

  • OP,请从下面测试两个(awk 和 join)解决方案并发布它们的执行时间?
  • 您的示例输入文件中没有一个逗号,因此您的真实输入文件不是 CSV,或者它是但您出于某种原因选择向我们展示不同的内容。解决您的问题,以便无论您是否有 CSV 文件,文本和输入都是一致的。

标签: awk sed grep


【解决方案1】:

你只需要一个简单的awk as

awk 'FNR==NR {a[$1]; next}; $1 in a' indexes.csv datatable.csv
id1 england male
  1. FNR==NR{a[$1];next} 将处理 indexes.csv 存储 数组的条目作为第一列的内容,直到结束 文件。
  2. 现在在datatable.csv,我可以匹配第一个文件中的那些行 $1 in a 这将给我当前文件中的所有那些行 列$1 的值a[$1] 与其他文件中的值相同。

【讨论】:

    【解决方案2】:

    也许我忽略了一些东西,但我构建了两个测试文件:

    a1:
    
    id1
    id2
    id3
    id6
    id9
    id10
    

    a2:
    
    id1 a 1
    id2 b 2
    id3 c 3
    id4 c 4
    id5 e 5
    id6 f 6
    id7 g 7
    id8 h 8
    id9 i 9
    id10 j 10
    

    join a1 a2 2> /dev/null

    我得到与第一列匹配的所有行。

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 2016-04-15
      • 2022-06-29
      • 1970-01-01
      • 2016-10-25
      • 2020-09-10
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多