在bash中结合while和if语句

时间:2014-10-14 22:17:38

标签: bash shell if-statement while-loop

假设我有一个文件file.txt,其中包含以下行:

cat
dog
fish
emu

我可以使用sed -n ip获取文件的内容,其中i是与行号对应的整数。我们打电话给每一行var

现在,我想使用每一行来查看它是否与另一个文件match.txt中与file.txt类似的行匹配。

match.txt的内容是这样的:

cat.food.something.more.1010.stuff
dog.more.something.stuff.1010.sometihng
emu.something.carrot.whatever

if语句如下:

if [[ -n $(grep -i $var /some/directory/match.txt | grep food | grep something | grep whatever ) ]]; then
    echo "$var matches"
else
    echo "$var" does not match"
fi

if语句中的grep'ing基本上将match.txt中的字符串删除到第一个单词。它基本上是在应用grep之后检查它是否返回了什么。

如何在bash中组合这两个函数?简而言之,我想检查文件中的每一行是否与另一个文件中的行匹配。

更新

我想要的是什么:

  1. file.txt每行都有一个字符串
  2. match.txt有字符串,使用grep,可能会匹配file.txt中的一行
  3. grep过滤器始终相同(暂时)
  4. file.txt的行数未知
  5. 我想检查file.txt中的行全部,如果匹配match.txt中的行与match.txt中的行匹配后的行grep的。
  6. 如果某些行匹配,请将其回显
  7. 将来会有多个match.txt并搜索这些内容,并回显出匹配来自match.txt的文件(因此无法选择加入)

3 个答案:

答案 0 :(得分:2)

您已经省略了很多细节,但是根据提供的详细信息,我们可以草拟类似

的内容
awk 'NR==FNR { w[++n] = $0; next }
    { m=0; for (i=1; i<=n; ++i) if ($0 ~ w[i]) { m=i; break } }
    m && /food/ && /something/ && /whatever/ { k[m]++ }
    END { for(i=1; i<=n; ++i)
        print "%s %s\n", w[i], (k[i] ? "matches" : "does not match") 
        }' file.txt /some/directory/match.txt

我们将第一个文件读入数组w(当您读取第一个输入文件时,表达式NR==FNR为true)。然后,在第二个文件中,我们检查w中的任何单词是否匹配;如果是,我们检查相同的输入行是否也匹配foodsomething以及whatever,如果是,我们通过在数组{{1}中设置其值来将其标记为已匹配}。最后,最后,我们并行循环kw,并检查k中的当前单词是否也位于w

如果您真的只关心这些单词是否匹配,那么删除匹配的表达式会更有效,并且当您不再有任何未匹配的表达式时退出; @ joepd的脚本做了类似的事情。合并这两者应该不难。

这里真正的教训是,如果您在管道中有大约两个k(通常是多个,或grepgrep或Awk的混合你应该考虑重构为Awk(或Perl,或Python,或者你有什么)帮助脚本。

答案 1 :(得分:1)

除非您想看到任何具体的例子,否则这可能已经部分满足您的需求:

grep -owhf file.txt match.txt

这将更接近您的要求:

awk '
    FNR==NR{a[$1]}
    FNR!=NR{
        for (re in a){
            if ($0~re){
                print re, "matches"
                delete a[re]
            }
        }
    }
    END{
        for (re in a){
            print re, "does not match"
        }
    }
' file.txt match.txt

答案 2 :(得分:1)

因此,您希望使用while循环遍历file.txt中的每一行,然后检查该行是否与match.txt中的内容匹配?这样的事情应该有效:

while read -r line; do
    if grep -q "${line}" match.txt; then
        echo "${line} matches"
    else
        echo "${line} does not match"
    fi
done < <(cat file.txt)