堆叠多个 for in 命令

堆叠多个 for in 命令

我正在处理大量数据,并且有一个涉及多个脚本的协议。我为每个输入文件单独启动它,只需在包含命令的文本文件中进行交换即可。我想知道当在命令中使用filename时,是否可以针对具有特定扩展名的所有文件自动执行它。for x in ...

我现在所拥有的例子

mkdir filename.file && for f in *.different_file; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done

我想要的功能:

for x in location/*.file do; mkdir $x && for f in *.different_file; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done ;done

主循环内会有更多的循环,但不再堆叠。

我怎样才能实现这样的目标?

编辑:关于我想要的更多信息,请原谅我的不专业语言:

我希望两个变量在两个循环内工作,一个在另一个循环内。我相信使用@Lety建议的嵌套循环可能是最佳解决方案,尽管需要一些时间来测试它。

我使用了一些其他命令来可视化该问题:

mkdir filename.file && for i in *.file2; do program  /filename.file/filename.file $i> $i.filename.file.out ; done && for f in *.file.out; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done && for i in *.file.out; do grep -v '^#' $i >> $i.trim; done

我希望将 filename.file 设置为对于所有循环都相同的变量:

for x in *.file do; mkdir $x && for i in *.file2; do program  /$x/$x $i> $i.$x.out ; done && for f in *.file.out; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done && for i in *.file.out; do grep -v '^#' $i >> $i.trim; done; done

我希望这能解释清楚一点。我将研究 bash 脚本中的嵌套循环,另一个困难是它也必须适用于 cygwin,但我想只要命令正确,这应该不成问题。

答案1

非常感谢@Lety 告诉我在哪里可以找到答案。嵌套循环运行得很好。

#!/bin/bash


outer=1
for x in *.hmm
do
    mkdir $x.dir
    inner=1
    for i in *.emitcons
    do
        program --different_output $i.$x.1mtblout $x $i> $i.$x.1mout
        rm $i.$x.1mout
        let "inner+=1"
    done
    for f in *.1mtblout
    do 
        [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f"
    done
    for i in *.1mtblout
    do
        grep -v '^#' $i >> $i.trim
    done
    for i in *.trim
    do
        echo $i >> $x\_trim_table
        sed -i -e '$a\' $x\_trim_table
        cat $i >> $x\_trim_table
        sed -i -e '$a\' $x\_trim_table
    done
    let "outer+=1"
echo
done
exit 0

...还有更多,但一切都很完美。

相关内容