查看文件中是否存在行列表

时间:2014-04-17 10:29:39

标签: bash grep

说我有一个文件(它将有大约500万行 - 假设它们存在于big.txt文件中)

a
b
c
d
e
f
g

我想检查文件是否包含以下行:

d
g
f

(要查询的35个项目 - 假设它们属于query.txt文件)

查询它的最佳方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用grep -f在另一个文件中查找一个文件的匹配项。然后,将输出与原始文件进行比较:

diff <(grep -f f2 f1 | sort) <(sort f2)

测试

使用您的给定文件:

$ diff <(grep -f f2 f1 | sort) <(sort f2)
$

更改为

$ cat f2
z
g
f

$ diff <(grep -f f2 f1 | sort) <(sort f2)
2a3
> z

您还可以使用cmp

cmp <(grep -f f2 f1 | sort) <(sort f2)

查看原始文件:

$ cat f2
d
g
f

$ if cmp <(grep -f f2 f1 | sort) <(sort f2) &>/dev/null; then echo "equal"; fi
equal

与不同的人:

$ cat f2
z
g
f

$ if cmp <(grep -f f2 f1 | sort) <(sort f2) &>/dev/null; then echo "equal"; fi
$

答案 1 :(得分:0)

使用awk:

awk 'FNR==NR{a[$0];next} length(a) && $0 in a{delete a[$0]} 
     END {print (length(a))?"Does not exist":"Exists"}' f2 f1
  • 此处f2是包含35个项目的小文件
  • f1是包含数百万个项目的更大文件
  • 这个awk读取内存(数组)中所有f2文件的行
  • 然后,它会针对f1行检查数组内容,并在每次匹配项目时删除数组元素
  • 最后,如果数组为空,则表示f2在f1中完全匹配,否则不是。

答案 2 :(得分:-1)

pcregrepgrep的免费替换版,它完全支持与Perl兼容的正则表达式:特别是带有换行符的正则表达式。因此,您的问题可以解决如下:

pcregrep -M "c\n(.*\n)*f(.*\n)*g" inputfile