【发布时间】:2016-04-23 13:50:56
【问题描述】:
我有一个脚本,它遍历一个文件并在另一个文件中找到匹配项。找到匹配项后如何让进程停止。
例如: 我取 name.txt 中的第一行,然后尝试在 file.txt 中找到它的匹配项。
名称.txt:
7,7,FRESH,98,135,
65,10,OLD,56,45,
文件.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;,但它退出了循环,这不是我想要的。
【问题讨论】:
-
如果您不希望它退出循环但又希望它停止处理行(这正是循环正在做的事情),这不是矛盾吗?你想达到什么目标?
-
@user3035772 我希望 if 语句在第一次成功匹配后停止。
-
这就是你现在所拥有的。我不明白这个问题。目前你的 if 语句应该让它说“我们有一个匹配”(我假设你会在那里放更多的代码),然后
break将导致它停止扫描file.txt以获取特定的name_id,并且而是从name.txt获取一个新的name_id。这听起来正是您所要求的,并且您的代码中已经包含它,那么需要有所不同吗? -
顺便说一下,这个命令可能会让你感兴趣:
join -t , -j 1 -o 1.1,1.2,2.2,1.3,2.3 <(sort -t, name.txt) <(sort -t, file.txt) | awk -F, '$2==$3 { print $4, $5 }'——如果是这样,这个问题类似于stackoverflow.com/questions/7392204/… -
@user3035772 我希望 if 语句在第一次成功匹配后停止,然后使用
$symbolName执行某些操作(运行一些命令)。如果它不退出 if 语句,那么它将为它在 file.txt 中找到的每个匹配项“执行某些操作/运行命令”,这不是我想要的。我只想对 if 语句的第一个匹配做点什么,然后退出循环并获取新的 name_id。
标签: bash shell unix if-statement scripting