我将从文件中获取文件名:FILE_A,并将在另一个文件中搜索这些文件名:File_B使用脚本说:script.sh
我想打印文件中不存在的文件名:FILE_B。 我使用代码但它没有用。
脚本中的代码 - > script.sh如下:
#!/bin/bash
while read line
do
grep -v "$line" FILE_B
done<FILE_A
请帮帮我。为什么它不起作用,它的解决方案是什么?
答案 0 :(得分:2)
grep
可以从文件中读取其输入;不需要循环。
grep -Fxvf FILE_A FILE_B
-F
选项指定输入是文字字符串,而不是正则表达式。否则,包含正则表达式元字符的输入将不匹配;或者不仅仅是它自己。例如,正则表达式a.c
匹配“aac”,“abc”等等。
-x
选项需要全行匹配。否则,输入“bc”将匹配包含它作为子字符串的任何行,例如“abcd”。
-v
选项表示打印不匹配的行而不是匹配。
最后,小写-f
选项指定文件名作为其参数,以用作要匹配的模式的输入。
答案 1 :(得分:1)
comm
对此有好处,但它需要对输入文件进行排序。如果这不是问题:
# lines in FILE_A that are not in FILE_B
comm -23 <(sort FILE_A) <(sort FILE_B)
答案 2 :(得分:0)
此脚本有效但无法打印您想要的内容。对于FILE_A中的每个文件名,它会在FILE_B中打印所有OTHER文件名。相反,如果grep找不到它,你应该自己打印文件名:
while read line
do
grep "$line" FILE_B >/dev/null || echo "$line"
done <FILE_A
答案 3 :(得分:0)
while
和do
grep -v expr file
会的
打印这些文件的所有行,不包含expr
。你想要的只是结果,无论它是否被发现。你需要测试一下
退出状态。尝试:
#!/bin/bash
while read line
do
grep -q "$line" FILE_B || echo "$line"
done<FILE_A
如果找到一行, grep返回0。 ||与echo连接意味着:execute echo when exit state != 0
- 即未找到$line
时。
答案 4 :(得分:0)
改为使用
#!/bin/bash
while read line
do
if grep -qw $line "file_B"
then
echo $line
fi
done < file_A