2014-02-23 43 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

我檢查它,它工作 –