在首次匹配bash脚本

时间:2016-01-18 11:43:36

标签: bash shell unix if-statement scripting

我有一个脚本,它遍历文件并在另一个文件中找到匹配项。一旦找到匹配,我该如何让这个过程停止。

例如: 我在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

我的问题是 - 如何在找到初始匹配后停止脚本迭代通过file.txt,然后将匹配的记录设置为变量,停止if语句,然后在循环中执行其他一些操作使用该变量。我尝试使用break;,但退出循环,这不是我想要的。

1 个答案:

答案 0 :(得分:0)

你可以告诉grep不同的事情:
在第一场比赛后停止搜索(选项-m 1) 从文件中读取searchkeys(选项-f file) 假设命令的输出是<(cmmnd)的文件(不是真正的grep,bash有帮助)。

结合这些将会给你

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