Bash文本搜索:查找一个文件的内容是否存在于另一个文件中。

6

假设我们有两个文件:a.txt和b.txt。每个文件都有多行文本。

我该如何编写一个shell脚本来检查a.txt的所有内容是否都存在于b.txt中?


谢谢大家的提示,我没有注意到-q选项会在成功匹配时输出0。

最终我得到了以下代码:

if grep a.txt -q -f b.txt ; then

else

fi


如果您能分享一下您尝试过的内容,这个问题会变得更好 - 即使只是为了帮助我们了解您对问题的理解程度。 - GreenAsJade
我们需要查看一些样本输入:a.txt是否以相同的顺序存在于a中?a.txt的所有是否以某种顺序存在于b.txt中? - glenn jackman
如果您可以对文件进行排序,您就可以使用 comm 命令。 - DominiCane
4个回答

8

尝试使用 grep

cat b.txt|grep -f a.txt

如果能够删除a.txt和b.txt中的所有\n,那么也许就可以解决问题,但是如何做到呢? - orange
2
不需要使用 cat 命令,可以直接使用 grep 命令从文件中读取:grep -f a.txt b.txt - glenn jackman
2
我认为 grep -f <patternfile> 只会显示与模式文件中的一些模式匹配,但不是全部。另一种方法是使用 sort -u 对文件进行排序,然后使用 comm -23 a.txt b.txt,如果没有在 b.txt 中出现过的 a.txt 行,则会产生空输出。 - Alexander Klimetschek

2

使用grep命令

grep -f a.txt b.txt

这不是一个完整的解决方案。它只会告诉你 a 的一些内容是否存在于 b 中,而不是所有的内容。 - GreenAsJade
括号不会执行命令。Diff 不会将一系列行作为 diff 的源之一,它比较的是两个文件。 - GreenAsJade
那就是你不理解请求的问题,我的解决方案比被接受的解决方案更好。啊哈! - BMW

1

这里有一个脚本可以实现您所描述的功能:

运行:sh SCRIPT.sh a.txt b.txt

# USAGE:   sh SCRIPT.sh TEST_FILE CHECK_FILE
TEST_FILE=$1
CHECK_FILE=$2

## for each line in TEST_FILE
while read line ; do

    ## check if line exist in CHECK_FILE; then assign result to variable
    X=$(grep "^${line}$" ${CHECK_FILE})


    ## if variable is blank (meaning TEST_FILE line not found in CHECK_FILE)
    ## print 'false' and exit
    if [[ -z $X ]] ; then
        echo "false"
        exit
    fi

done < ${TEST_FILE}

## if script does not exit after going through each line in TEST_FILE,
## then script will print true
echo "true"

假设:

  • a.txt 中的行顺序不重要

0
你需要编写一个循环,遍历 a.txt 中的每一行,并使用 grep(或其他方法)查看该行是否在 b.txt 中。如果你发现有任何不在 b.txt 中的实例,则可以提供答案:并非所有行都匹配。如果你没有找到这样的实例,则可以得出结论:所有行都匹配。
使用反引号捕获 grep 的输出可能会很有用:
if [`grep -v $line b.txt`==  ""]; then

这是与编程有关的内容。

如果您对如何迭代文件内容有具体问题,您应该提出一个具体的问题,并展示您尝试过的内容。


踩个负评,但为什么没有解释呢? - GreenAsJade
1
显然,那不是正确的答案,if命令无法解决问题。 - BMW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接