如何在文件中grep文件

时间:2014-07-28 19:44:36

标签: bash

我正在尝试grep另一个文件中的文件内容。我将举例说明。这是parent.txt:

# parent.txt
abc
def
ghi
jkl

这是child1.txt:

def
ghi

这是child2.txt:

jkl
mno

这是child3.txt

abc
ghi

我基本上想要做的是使用' grep -q'查找父文件中的子文件。 child1.txt的检查应该返回true,因为它是一个完整的匹配。 child2.txt的检查应返回false,因为它只是部分匹配。 child3.txt也应返回false,因为匹配必须具有凝聚力。任何建议都非常感谢。

5 个答案:

答案 0 :(得分:1)

使用diffgrepwc,您可以获得所需内容。

count=$(diff parent.txt child1.txt | grep '^>' | wc -l)
if [[ $count > 0 ]]; then echo "false"; else echo "true"; fi

答案 1 :(得分:1)

tr "\n" " " <parent.txt | grep -q "$(tr "\n" " " <child1.txt)" && echo true || echo false
tr "\n" " " <parent.txt | grep -q "$(tr "\n" " " <child2.txt)" && echo true || echo false
tr "\n" " " <parent.txt | grep -q "$(tr "\n" " " <child3.txt)" && echo true || echo false

输出:

true
false
false

答案 2 :(得分:1)

使用bash模式匹配:

parent_contents=$(< parent.txt)
for child in child*.txt; do 
    if [[ "$parent_contents" == *"$(< "$child" )"* ]]; then
        echo $child is cohesively contained in parent
    else
        echo $child is not
    fi
done
child1.txt is cohesively contained in parent
child2.txt is not
child3.txt is not

封装函数:

cohesively_contains() {
    local parent=$(< "$1")
    local child=$(< "$2")
    [[ "$parent" == *"$child"* ]]
}
for child in child*.txt; do 
    cohesively_contains parent.txt "$child" && echo true || echo false
done
true
false
false

答案 3 :(得分:0)

使用awk它更简单:

awk 'FNR==NR {a[$1]++;next} !($1 in a)' parent.txt child1.txt

awk 'FNR==NR {a[$1]++;next} !($1 in a)' parent.txt child2.txt
mno

答案 4 :(得分:0)

#!/usr/bin/gawk -f
{
    if (NR == FNR) {
        a[$0] = FNR
        b[FNR] = $0
    } else if (FNR == 1) {
        if (!(p = a[$0]))
            nextfile
    } else if ($0 != b[++p]) {
        p = 0
        nextfile
    }
}
ENDFILE {
    if (p)
        print FILENAME
}

用法:

gawk -f script.awk parent.txt child1.txt child2.txt child3.txt

输出:

child1.txt

使用

ENDFILE {
    print FILENAME (p ? ": true" : ": false")
}

输出:

child1.txt: true
child2.txt: false
child3.txt: false