2014-02-23 113 views
0

我将获取从文件的文件名中的文件的文件名说:FILE_A,并将搜索在另一个文件中,这些文件的名称说:FILE_B使用脚本说:script.sh搜索使用shell脚本

我想要打印文件中不存在的文件名称:FILE_B。 我使用的代码,但它没有奏效。在脚本 -

代码> script.sh如下:

#!/bin/bash 
while read line 

do 
     grep -v "$line" FILE_B 

done<FILE_A 

请帮助我。为什么它不工作,它的解决方案是什么?

+1

非常低效到grep FILE_B在FILE_A –

回答

0
  1. 没有多余的换行符和do之间while
  2. grep -v expr file将 打印这些文件的所有线路,不含expr。你想要什么,只是结果是否被发现。您需要测试 退出状态。

尝试:如果某行被发现

#!/bin/bash 
while read line 
do 
     grep -q "$line" FILE_B || echo "$line" 

done<FILE_A 

grep的退出返回0。 ||与回声串接意味着:execute echo when exit state != 0 - 即当找不到$line

+0

grep还应该添加-w参数来检查完整的文件名,而不仅仅是盲目的文本搜索......对吧? –

+0

待定:如果文件名只是该行的一部分,该怎么办? OP不发布关于这些细节的任何要求。 –

+0

不,假设file_A中的文件名是file123,并且file_B中有一个文件“file12345”然后处理这种情况,-w是必需的 –

0

此脚本有效,但不打印您想要的内容。对于FILE_A中的每个文件名,它将在FILE_B中打印所有OTHER文件名。相反,你应该自己打印的文件名,如果grep的没有找到它:

while read line 
do 
    grep "$line" FILE_B >/dev/null || echo "$line" 
done <FILE_A 
+0

grep的每一行还应该添加-w参数来检查完整的文件名,而不只是盲目的文本搜索,对吧? –

+0

如果每行都是纯文件名,它没有任何区别。 – SzG

+0

是的,因为你说它用来做同样的事情,你可以尝试以上解决方案,我已经验证 –

0

使用这个代替

#!/bin/bash 
while read line 
do 
    if grep -qw $line "file_B" 
    then 
    echo $line 
    fi 
done < file_A 
+0

它打印出现在FILE_B 中的文件名我只需要打印所有不存在于FILE_B中的文件名。你的ans需要一些修改。请回复。 –

+0

它打印出现在FILE_B中的文件名我只需要打印所有不存在于FILE_B中的文件名。你的ans需要一些修改。请回复。 –

2

grep可以从文件中读取它的输入;不需要循环。

grep -Fxvf FILE_A FILE_B 

-F选项指定输入是文字字符串,而不是正则表达式。否则,包含正则表达式元字符的输入将不匹配自身;或者不仅仅是它本身。例如,正则表达式a.c与“aac”,“abc”等匹配。

-x选项需要全行匹配。否则,输入“bc”将在包含它的任何行上匹配为子字符串,例如“abcd”。

-v选项表示打印不匹配的行而不匹配。

最后,小写-f选项指定文件名作为其参数,以用作要匹配的模式的输入。

+0

虽然命令运行时没有输出,但您的答案需要更多的添加/修改才能打印。请回复。 –

+0

如果没有更多信息,我可以回复但不是真的有帮助。这个对我有用。 http://pastebin.com/9y2YvwEN – tripleee

+0

但它不工作在我的环境中,样品你显示在pastebin上(链接在回复中提到),我需要它作为类似的工作。如果你知道为什么它不工作,那么请分享这些信息。 –

1

comm对此很有用,但它需要对输入文件进行排序。如果这不是一个问题:

# lines in FILE_A that are not in FILE_B 
comm -23 <(sort FILE_A) <(sort FILE_B) 
+0

我检查它,它工作 –