【问题标题】:Exclude a file based on keys from another根据另一个文件的键排除文件
【发布时间】:2014-08-05 17:49:47
【问题描述】:

我的 file1.txt 格式类似于

key100 3 5 7
key101 2 5 6
key103 1 0 0
key202 3 2 1
key204 0 0 0

其中 keyXXX 是唯一的(并且按 keyXXX 排序)。

然后我在 file2.txt 中有一个唯一键列表(也已排序)以排除喜欢

key100
key200
key202

是否有我可以运行的 bash 命令返回 file1.txt,其中排除了 file2.txt 中的所有键?

此示例的输出如下所示:

key101 2 5 6
key103 1 0 0
key204 0 0 0

file1.txt 非常大,因此遍历每个 file2.txt 键并使用 grep -v 似乎很慢。 comm 似乎是我想要的,但需要整行匹配。有没有更有效的方法来做到这一点?

【问题讨论】:

    标签: bash


    【解决方案1】:
    fgrep -v -f FILE2 FILE1 > RETURN.txt 
    

    比运行多个 grep 进程快一点(因为fgrep 搜索固定字符串而不是正则表达式,它不会为每个模式行打开文件,就像循环通过 FILE2 那样)。

    【讨论】:

      【解决方案2】:

      如果file2.txt 不是太大,那么awk 'NR==FNR {a[$0]++; next} !($1 in a)' file2.txt file1.txt 应该适合你。

      如果是这样,假设两个文件都按键排序,应该可以在处理file1.txt 中的行时按需从file2.txt 读取下一个键,因此在内存中只保留一个键和行一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        相关资源
        最近更新 更多