在UNIX shell脚本中为每个';n';处决

在UNIX shell脚本中为每个';n';处决,unix,ksh,Unix,Ksh,我有两个文件:file.dat和mapping.dat file.dat包含条目(可以包含重复条目),而mapping.dat是一个静态文件,其中包含条目及其相应的会话/作业名称,以逗号分隔。 我开发了一个简单的UNIX Shell脚本,它在循环中运行,对于file.dat中的每个条目,它在mapping.dat中搜索会话/作业名称并显示输出 文件.dat的内容 ekm ckm cnc cnx ekm hnm dam #Entry,Job_Name# ckm,BDSCKM cnc,BDSCN

我有两个文件:file.datmapping.dat

file.dat包含条目(可以包含重复条目),而mapping.dat是一个静态文件,其中包含条目及其相应的会话/作业名称,以逗号分隔。 我开发了一个简单的UNIX Shell脚本,它在循环中运行,对于file.dat中的每个条目,它在mapping.dat中搜索会话/作业名称并显示输出

文件.dat的内容

ekm
ckm
cnc
cnx
ekm
hnm
dam
#Entry,Job_Name#

ckm,BDSCKM
cnc,BDSCNC
cnx,BDSCNX
ekm,BDSEKM
azm,BDSAZM
bam,BDSBAM
cam,BDSCAM
oid,BDSOID
hnm,BDSHNM
dam,BDSDAM
For ekm, Session launched is: BDSEKM 
For ckm, Session launched is: BDSCKM 
For cnc, Session launched is: BDSCNC 
For cnx, Session launched is: BDSCNX
For ekm, Session launched is: BDSEKM 
For hnm, Session launched is: BDSHNM 
For dam, Session launched is: BDSDAM 
映射的内容.dat

ekm
ckm
cnc
cnx
ekm
hnm
dam
#Entry,Job_Name#

ckm,BDSCKM
cnc,BDSCNC
cnx,BDSCNX
ekm,BDSEKM
azm,BDSAZM
bam,BDSBAM
cam,BDSCAM
oid,BDSOID
hnm,BDSHNM
dam,BDSDAM
For ekm, Session launched is: BDSEKM 
For ckm, Session launched is: BDSCKM 
For cnc, Session launched is: BDSCNC 
For cnx, Session launched is: BDSCNX
For ekm, Session launched is: BDSEKM 
For hnm, Session launched is: BDSHNM 
For dam, Session launched is: BDSDAM 
当前脚本:

#!/bin/ksh
for FILE in `cat file.dat`
do
        SESSION=`grep $FILE mapping.dat | cut -d, -f2`
        echo "For ${FILE}, Session launched is: ${SESSION} "
done
电流输出

ekm
ckm
cnc
cnx
ekm
hnm
dam
#Entry,Job_Name#

ckm,BDSCKM
cnc,BDSCNC
cnx,BDSCNX
ekm,BDSEKM
azm,BDSAZM
bam,BDSBAM
cam,BDSCAM
oid,BDSOID
hnm,BDSHNM
dam,BDSDAM
For ekm, Session launched is: BDSEKM 
For ckm, Session launched is: BDSCKM 
For cnc, Session launched is: BDSCNC 
For cnx, Session launched is: BDSCNX
For ekm, Session launched is: BDSEKM 
For hnm, Session launched is: BDSHNM 
For dam, Session launched is: BDSDAM 
我的问题是,我想为每2次出现的输出引入一个等待/睡眠时间,即它应该首先显示

For ekm, Session launched is: BDSEKM 
For ckm, Session launched is: BDSCKM
等待90秒,然后

For cnc, Session launched is: BDSCNC 
For cnx, Session launched is: BDSCNX

…等等

试着用
%
帮助自己

#!/bin/ksh
count=1
for file in $( cat file.dat )
do

  session=$( grep $file mapping.dat | cut -d, -f2 )
  echo "For ${file}, session launched is ${session}."

  if (( count % 2 == 0 ))
  then
    sleep 90
  fi
  (( count++ ))
done

要打印前两行,请等待90秒,然后打印下两行,以此类推。 按照Tony Stark的建议,使用
%
模运算符。不需要初始化计数器

#!/bin/bash
for file in $( cat file.dat )
do
  session=$( grep $file mapping.dat | cut -d, -f2 )
  echo "For ${file}, session launched is ${session}."
  (( count++ % 2 )) && sleep 90
done

下面是我的做法,我在一条消息中添加了未识别项(您只需从while read循环的第一行删除
| | session='unrecogned'
,就可以安全地删除该项)。我对ksh不太熟悉,但我相信在这种情况下,
read
与bash是一样的(我非常熟悉bash)

我用您的示例数据进行了测试,它在
ksh
bash
上都有效

#!/bin/ksh
# Print 2 mappings every 90 seconds

FILE="./file.dat"
MAP="./mapping.dat"

while IFS= read -r line; do
        session=$(grep "$line" "$MAP") || session='UNRECOGNIZED'
        echo "For $line, session launched is: ${session#*,}"
        ((count++ % 2)) && sleep 90
done < "$FILE"
#/bin/ksh
#每90秒打印2个映射
FILE=“./FILE.dat”
MAP=“./mapping.dat”
而IFS=读取-r行;做
session=$(grep“$line”“$MAP”)| | session='unrecogned'
echo“对于$line,启动的会话是:${session#*,}”
((计数+++%2))&睡眠90
完成<“$FILE”

我使用了非贪婪后缀删除(
#
)来隔离“会话”。

您可以将
count=$((count+1))
简化为
((count++)
回答得好。也许你可以指出为什么
while;做done
是读取文件的更好模式。祝大家好运。事实上,while read循环可能是单独处理文件的每一行最安全的方法。它可能会稍微慢一点,主要是对于较大的文件,因为
read
会对文本的每个字节(字符)进行系统调用。
for
循环可以工作,速度更快,但依赖于不带引号的参数,这是有问题的。然后至少设置
IFS=$'\n'
(bash表示“新行”)。在这种情况下,它并没有那么糟糕,例如数据不包含空格。