我有一个脚本,它遍历文件并在另一个文件中找到匹配项。一旦找到匹配,我该如何让这个过程停止。
例如: 我在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;
,但退出循环,这不是我想要的。
答案 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