用于在分层目录结构中使用bash循环和AWK计算和提取结果的脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于在分层目录结构中使用bash循环和AWK计算和提取结果的脚本相关的知识,希望对你有一定的参考价值。
我具有以下directory结构以及某些感兴趣的文件,在这些文件上,我必须使用awk进行计算/算术运算。
$ mkdir DP1/postProcessing/0/ DP2/postProcessing/0/ DP3/postProcessing/0/;
$ touch DP1/postProcessing/0/wallShearStress.dat DP1/postProcessing/0/wallShearStress_0.02.dat DP2/postProcessing/0/wallShearStress_0.dat DP2/postProcessing/0/wallShearStress_0.1.dat DP3/postProcessing/0/wallShearStress_0.05.dat DP3/postProcessing/0/wallShearStress_0.000012.dat
masterDir/;
$ tree masterDir/
masterDir/
├── DP1
│ └── postProcessing
│ └── 0
│ ├── wallShearStress_0.02.dat
│ └── wallShearStress.dat
├── DP2
│ └── postProcessing
│ └── 0
│ ├── wallShearStress_0.1.dat
│ └── wallShearStress_0.dat
└── DP3
└── postProcessing
└── 0
├── wallShearStress_0.000012.dat
├── wallShearStress_0.05.dat
└── wallShearStress.dat
预期输出
DP File_processed Ouput_value #Optional header
DP1 wallShearStress_0.02.dat <some result using AWK>
DP2 wallShearStress_0.1.dat <some result using AWK>
DP3 wallShearStress_0.05.dat <some result using AWK>
我的(非常基础的)尝试失败,该脚本只为最后找到的目录返回三次文件:
$ for i in $(find -type d -name "DP*"); do
> for j in $(find . -type f -name "wallShearStress*" | tail -n 1); do
> echo $j;
> awk 'NR == 3 print $0' $j; # this just for example ...
> # but I wanna do something more here, but no issue with that
> # once I can get the proper files into AWK.
> done;
> done;
./DP3/postProcessing/0/wallShearStress_0.05.dat
./DP3/postProcessing/0/wallShearStress_0.05.dat
./DP3/postProcessing/0/wallShearStress_0.05.dat
问题定义:我想要,
- 首先,在每个目录中找到名为
wallShearStress*.dat
的文件。在哪里, - 感兴趣的文件末尾应具有最大编号。 (为澄清起见,目录中存在多个
wallShearStress*.dat
文件,例如,对于DP3
,仅应选择DP3\postProcessing\0\wallShearStress_0.05.dat
进行处理,因为其优先级高于DP3\postProcessing\0\wallShearStress.dat
,类似地,仅应选择DP1\postProcessing\0\wallShearStress_0.02.dat
和DP2\postProcessing\0\wallShearStress_0.1.dat
被选择) - 对于每个目录,对选定的
wallShearStress*.dat
用awk进行算术运算,并在masterDir
中以.txt
/.csv
文件的形式输出,如下所示:
问题
- 该方法有什么问题?
- 还有更好的方法吗? (请记住,问题在于获取正确的文件,而不是AWK)。
答案
您可以仅对父目录使用for循环,对子目录使用find。如果您的sort
具有-V
标志,请使用该标志。
#!/usr/bin/env bash
for d in masterDir/DP*/; do
find "$d" -type f -name 'wallShearStress*'| sort -Vk2 -t.| head -n1
done
要循环输出,可以使用while读取循环。
#!/usr/bin/env bash
while IFS= read -r files; do
echo Do something with "$files"
done < <(for d in masterDir/DP*/; do find "$d" -type f -name 'wallShearStress*'| sort -Vk2 -t.| head -n1; done )
-t, --field-separator=SEP use SEP instead of non-blank to blank transition
<()
是Process Substitution,它是某种文件,精确的管道请参见ls -l <(:)
的输出,并且要从文件中读取,您需要<
重定向符号并将其与<( )
分开,否则会出现错误。
以上是关于用于在分层目录结构中使用bash循环和AWK计算和提取结果的脚本的主要内容,如果未能解决你的问题,请参考以下文章