假设我有一个文件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中组合这两个函数?简而言之,我想检查文件中的每一行是否与另一个文件中的行匹配。
更新
我想要的是什么:
file.txt
每行都有一个字符串match.txt
有字符串,使用grep,可能会匹配file.txt
中的一行file.txt
的行数未知file.txt
中的行全部,如果匹配match.txt
中的行与match.txt
中的行匹配后的行grep的。 match.txt
并搜索这些内容,并回显出匹配来自match.txt
的文件(因此无法选择加入)答案 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
中的任何单词是否匹配;如果是,我们检查相同的输入行是否也匹配food
和something
以及whatever
,如果是,我们通过在数组{{1}中设置其值来将其标记为已匹配}。最后,最后,我们并行循环k
和w
,并检查k
中的当前单词是否也位于w
。
如果您真的只关心这些单词是否匹配,那么删除匹配的表达式会更有效,并且当您不再有任何未匹配的表达式时退出; @ joepd的脚本做了类似的事情。合并这两者应该不难。
这里真正的教训是,如果您在管道中有大约两个k
(通常是多个,或grep
和grep
或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)