【问题标题】:exiting an IF statement after initial match bash scripting在初始匹配 bash 脚本后退出 IF 语句
【发布时间】: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 &lt;(sort -t, name.txt) &lt;(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


【解决方案1】:

你可以告诉 grep 不同的东西:
在第一次匹配后停止搜索(选项-m 1)。
从文件中读取搜索键(选项-f file)。
假设命令的输出是带有&lt;(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

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2013-06-15
    • 1970-01-01
    • 2017-01-15
    • 2019-03-08
    相关资源
    最近更新 更多