我需要从大量文件(data2
,data3
,...)中查找在data1
中存在的空值分隔项目。需要精确匹配。
使用grep -f data1 data2 data3 ...
可以正常运行,但是如果data1
中的项目也是空值分隔的,则无法正常工作。
Using only newlines - ok:
$ cat data1 1234 abcd efgh 5678 $ cat data2 1111 oooo abcd 5678 $ grep -xFf data1 data2 abcd 5678
data2
contains null-delimited items - ok when-z
used:$ printf '1111\0oooo\0abcd\0005678' > data2 $ grep -zxFf data1 data2 | xargs -0 printf '%s\n' abcd 5678
Now both
data1
anddata2
contain null-delimited items - fail. Seems that the-z
option does not apply to the file specified with-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
)?
comm
操作是否可以像grep
一样工作? (并且您是否有带-z
的 GNUcomm
?) - Charles Duffygrep
是因为你真的需要它的正则表达式匹配速度,还是因为你遇到了一个起初足够简单以便用grep
来拼凑解决方案的问题?如果是后者,那么现在是你转向一种具有适当数据结构的语言的时候了,将data
读入内存,并从那里开始。 - chepner