gpt4 book ai didi

bash - 如果 "grep -f file"具有空分隔项,如何使用 "file"?

转载 作者:行者123 更新时间:2023-11-29 09:03:27 25 4
gpt4 key购买 nike

我需要从存在于 data1 中的大量文件(data2data3 等)中找到以 null 分隔的项。需要完全匹配。

一切都与 grep -f data1 data2 data3 ... 配合使用,直到 data1 中的项目也是空分隔的。

  1. 仅使用换行符 - ok:

    $ cat data1
    1234
    abcd
    efgh
    5678
    $ cat data2
    1111
    oooo
    abcd
    5678
    $ grep -xFf data1 data2
    abcd
    5678
  2. data2 包含空分隔项 - ok 当使用 -z 时:

    $ printf '1111\0oooo\0abcd\0005678' > data2
    $ grep -zxFf data1 data2 | xargs -0 printf '%s\n'
    abcd
    5678
  3. 现在 data1data2 都包含空分隔项 - 失败。似乎 -z 选项不适用于用 -f 指定的文件:

    $ printf '1234\0abcd\0efgh\0005678' > data1
    $ grep -zxFf data1 data2 | xargs -0 printf '%s\n'

    $

问题是我确实需要这两个文件来包含空分隔项。明显的解决方法可能是(例如)一个很好的旧 while 循环:

while IFS= read -rd '' line || [[ $line ]]; do
if grep -zqxF "$line" data2; then
printf '%s\n' "$line"
fi
done < data1

但是因为我有很多包含很多项目的文件,这会非常慢!有没有更好的方法(我不坚持使用grep)?

最佳答案

由于订单保留并不重要,您正在尝试匹配精确的字符串,并且您有可用的 GNU 工具,而不是使用 fgrep 我建议 comm -z.

$ printf '%s\0' 1111 oooo abcd 005678 >data2
$ printf '%s\0' 1234 abcd efgh 005678 >data
$ comm -z12 <(sort -uz <data) <(sort -uz <data2) | xargs -0 printf '%s\n'
005678
abcd

如果您首先生成排序的文件(因此可以省去 sort 操作),这也将具有非常好的内存和性能特征。

关于bash - 如果 "grep -f file"具有空分隔项,如何使用 "file"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52061327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com