用于在分层目录结构中使用bash循环和AWK计算和提取结果的脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于在分层目录结构中使用bash循环和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.datDP2\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计算和提取结果的脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 awk 循环中访问 bash 数组

计算机网络体系结构-第二节体系结构与参考模型1:分层结构协议接口和服务

概述-第五节1:计算机网络体系结构之分层思想和举例

概述-第五节1:计算机网络体系结构之分层思想和举例

awk:计算不同文件中数据的平均值

四.AWK分支和循环