Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阅读';n';从文件中删除行,并使用Shell脚本进行迭代_Shell_Batch Processing - Fatal编程技术网

阅读';n';从文件中删除行,并使用Shell脚本进行迭代

阅读';n';从文件中删除行,并使用Shell脚本进行迭代,shell,batch-processing,Shell,Batch Processing,我有一份300行的员工档案。现在我正在读取其中的所有行,并调用一个子流程进行处理。但是我需要一次读取20行,并为它调用一个子流程,然后迭代直到它完成所有300行 while read -r name age empno ; do echo $EmpName $EmpAge $EmpNumber ./run.sh RUN_EMP -a $EmpName -b $EmpAge -c $EmpNumber & done < "$File_Employee" &g

我有一份300行的员工档案。现在我正在读取其中的所有行,并调用一个子流程进行处理。但是我需要一次读取20行,并为它调用一个子流程,然后迭代直到它完成所有300行

while read -r name age empno ; do
    echo $EmpName $EmpAge $EmpNumber
    ./run.sh RUN_EMP -a $EmpName -b $EmpAge -c $EmpNumber &  
   done < "$File_Employee" >  /logs/Emp_`date +%Y%m%d%H%M`.log
   wait
读取时-r name-age-empno;做
echo$EmpName$EmpAge$EmpNumber
./run.sh run_EMP-a$EmpName-b$EmpAge-c$EmpName&
完成<“$File\u Employee”>/logs/Emp\u`date+%Y%m%d%H%m`.log
等待
Shell脚本中是否有限制要读取的行数的选项

如果我需要在任何给定时间运行20个进程;我下面的方法行吗?当我尝试执行此操作时,该流程将针对前20个作业运行,并优雅地存在

    while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
        while [[ $( jobs | wc -l ) -ge 20 ]]
      do
        echo going to sleep now at $(date)
        sleep 3
          done
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
      done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log
wait
读取时-r empname empage empnumber;做
echo$empname$empage$empnumber
而[[$(工作岗位| wc-l)-ge 20]]
做
echo现在将在$(日期)睡觉
睡眠3
完成
./run.sh run_EMP-a$empname-b$empage-c$empname&
已完成Emp_`date+%Y%m%d%H%m`.日志
等待
您可以这样做

end=0
while [ $end -eq 0 ]; do
    for (( i=0 ; $i < 20 ; i++ )) do
        read -r name age empno || {
            end=1
            break
        }
        # do something with it
    done
    # do something with the group
done
end=0
而[$end-等式0];做
对于((i=0;$i<20;i++)do
read-r姓名年龄empno | |{
结束=1
打破
}
#用它做点什么
完成
#与团队合作
完成

还有其他类似的形式。请注意,您可能需要做好准备,以防输入无法平均分成20行的组。示例代码尽其所能处理这些问题,但“做点什么”部分可能需要自己的调节。

bash
脚本统计创建的
/run.sh
进程数,每20个进程停止并等待它们完成,然后再开始更多:

#!/bin/bash
count=0
while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
    ((++count % 20 == 0 )) && wait
done <"$File_Employee" >/logs/Emp_`date +%Y%m%d%H%M`.log
此行将计数增加1,然后检查
count
是否为20的倍数。如果是,则调用
bash
内置
wait
,等待后台进程完成

POSIX 以下内容适用于任何POSIX shell:

File_Employee=employees
count=0
while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
    count=$((count+1))
    [ 0 -eq $((count % 20)) ] && wait
done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log
File\u Employee=employees
计数=0
读取-r empname empage empnumber时;做
echo$empname$empage$empnumber
./run.sh run_EMP-a$empname-b$empage-c$empname&
计数=$((计数+1))
[0-相等$((计数%20))]&等待(&W)
已完成Emp_`date+%Y%m%d%H%m`.日志

如何将20行代码传递给
run.sh
?现在我将整个文件作为输入传递给run.sh,因此有300个子进程在后台运行。我在想,如果我能有某种程度的过滤器;这样,它可以每20行或任何自定义值拆分和读取文件,并调用子进程。使用
拆分
将输入文件拆分为每20行,然后为每个拆分的子文件调用子进程。@Ragav如果同时将
/run.sh
的命令行传递给它20行以运行,它的命令行会是什么样子?或者,您是否打算运行20个进程的
/run.sh
,然后等待它们完成,然后再启动20个进程?@John1024我的意图是运行run.sh的前20个进程-(基本上,此脚本的设计方式是可以并行批处理运行)我将等待它们完成,然后从下一个20行开始,直到我的员工文件中的所有行都被读取。当我尝试时,它会处理前20行,然后优雅地退出。顺便说一句,我使用sh进行我的流程。@Ragav“我使用sh进行我的流程。”请澄清。如果
run.sh
使用
sh
而不是
bash
,这应该无关紧要,但是我添加的行中的算法需要
bash
。您使用的是什么操作系统和
sh
的哪个版本?@johh版本的常规Bourne Shell-/usr/bin/sh OSLinux@Ragav我刚刚用一个版本更新了答案,这个版本应该适用于任何基本的POSIX兼容shell。现代linux系统不再使用“常规Bourne Shell”。他们至少都在努力实现POSIX合规性。例如,如果您使用的是类似于Debian的系统(包括Ubuntu),那么
/bin/sh
就是
dash
shell。上面的脚本将在
dash
下运行。我正在探索一个选项,在任何给定时间始终运行20个进程。如果我的第一个流程完成,我将开始下一个流程。这样我就可以利用并行性。请告诉我这是否正确;更新了我的问题代码。
File_Employee=employees
count=0
while read -r empname empage empnumber ; do
    echo $empname $empage $empnumber
    ./run.sh RUN_EMP -a $empname -b $empage -c $empnumber &
    count=$((count+1))
    [ 0 -eq $((count % 20)) ] && wait
done <"$File_Employee" >Emp_`date +%Y%m%d%H%M`.log