我正在处理大量数据,并且有一个涉及多个脚本的协议。我为每个输入文件单独启动它,只需在包含命令的文本文件中进行交换即可。我想知道当在命令中使用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
...还有更多,但一切都很完美。