【问题标题】:remove lines from file 1 that match elements in specific column from file 2 [duplicate]从文件1中删除与文件2中特定列中的元素匹配的行[重复]
【发布时间】:2020-08-25 07:37:53
【问题描述】:

我有一个像这样的 A.txt 文件(真正的文件有 ~1000 行和 ~70,000 列):

ID    SEX    A    B    C
45    1    4.5    9.2    5.4
34    0    3.4    4.5    9.0
2    0    3.5    7.8    0.7
56    1    5.6    7.6    0.7

还有一个像这样的文件 B.txt(真正的有大约 600 行):

45
2

我想从 A.txt 中删除 ID 与文件 B.txt 中的 ID 匹配的所有行。预期输出(文件 C.txt):

ID    SEX    A    B    C
34    0    3.4    4.5    9.0
56    1    5.6    7.6    0.7

我在想这样的事情: grep -v -f B.txt A.txt > C.txt

但是这个脚本没有指定A.txt的列

【问题讨论】:

  • 将“列表”文件转换为 '/^2$/d' 之类的记录(每行一个)并提供给 sed 之类的 sed -f "listFile" mainFile > outputFile。您可以使用sed 's:.*:/^&$/:' baseList > listFile 之类的内容修复“listFile”。只在副本上工作!抱歉 join 建议(现已删除),我错过了 70,000 列的事情。祝你好运。

标签: shell sed grep


【解决方案1】:

将B.txt的行变成锚定在行首的正则表达式:

$ grep -v -f <(sed 's/.*/^&[[:space:]]/' B.txt) A.txt
ID    SEX    A    B    C
34    0    3.4    4.5    9.0
56    1    5.6    7.6    0.7

(假设您使用的是bashzshksh93 或其他支持&lt;() 命令重定向的shell。)

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2016-08-13
    • 2019-01-01
    • 2020-05-19
    • 2021-11-01
    • 1970-01-01
    • 2015-04-12
    • 2021-10-01
    相关资源
    最近更新 更多