2016-01-18 50 views
0

我有一個腳本遍歷一個文件並在另一個文件中查找匹配。一旦找到匹配項,我如何讓程序停止。在初始匹配bash腳本後退出一條IF語句

例如: 我在name.txt的第一行,然後嘗試在file.txt中爲它找到一個匹配項。

name.txt:

7,7,FRESH,98,135, 
65,10,OLD,56,45, 

file.txt的:

7,7,Dave,S 
8,10,Frank,S 
31,7,Gregg 
45,5,Jake,S 

腳本:

while read line 
do 

    name_id=`echo $line | cut -f1,2 -d ','` 
    identiferOne=`echo $name_id | cut -f1 -d ','` 
    identiferTwo=`echo $name_id | cut -f2 -d ','` 


    while IFS= read line 
    do 
     CHECK=`echo $line | cut -f4 -d','` 
     if [ $CHECK = "S" ] 
     then 
      symbolName=`echo $line | cut -f3 -d ','` 
      numberOne=`echo $line | awk -F',' '{print $1}'` 
      numberTwo=`echo $line | cut -f2 -d ','` 

      if [ "$numberOne" == $identiferOne ] && [ "$numberTwo" == $identifierTwo ] 
      then 
       echo "WE HAVE A MATCH with $symbolName" 
       break 
      fi 
     fi 

    done < /tmp/file.txt 

done < /tmp/name.txt 

我的問題是 - 如何從通過文件迭代停止腳本。 txt一旦找到初始匹配,然後將匹配的記錄設置爲變量,停止if語句,然後執行一些操作使用該變量的循環內的其他內容。我嘗試使用break;,但退出循環,這不是我想要的。

+0

如果你不希望它退出循環,但你希望它停止加工生產線(這是正是循環所做的),這不是一個矛盾嗎?你想要達到什麼目標? – user3035772

+0

@ user3035772我希望if語句在第一次成功匹配後停止。 – nrs90

+0

這就是你現在所擁有的。我不明白這個問題。目前你的if語句應該說「我們有一個匹配」(我假設你將在那裏放置更多的代碼),然後'break'將導致它停止掃描'file.txt'來指定'name_id' ,然後從'name.txt'中取一個新的'name_id'。這聽起來像你要求的,你已經在你的代碼中,所以需要有什麼不同? – user3035772

回答

0

你可以告訴grep不同的東西:
第一場比賽後停止搜索(選項-m 1)。
從文件中讀取搜索鍵(選項-f file)。
假設一個命令的輸出是一個文件(不是真的grep,bash幫助這裏)與<(cmmnd)

結合這會給你

grep -m1 -f <(cut -d"," -f1-2 name.txt) file.txt 

關閉,但不是你想要的。由cut -d"," -f1-2 name.txt給出的子串將匹配該行中的所有位置,並且您希望匹配前兩個字段。在該行的開頭匹配是^完成的,所以我們用sed來做出這樣^field1,field2字符串:

grep -m1 -f <(sed 's/\([^,]*,[^,]*,\).*/^\1/' name.txt) file.txt