Скрипт для расчета и извлечения результатов с использованием циклов bash и AWK в иерархической структуре каталогов.

У меня есть следующая структура каталог с определенными интересующими файлами , на котором я должен выполнять вычисления/арифметические операции, используя

bash + awk (поскольку мне проще понять, чем если бы кто-то придумал другие языки программирования ). Большое вам спасибо за ваше время!


person massisenergy    schedule 18.05.2020    source источник
comment
Спасибо, что указали на ошибку. Исправлено.   -  person massisenergy    schedule 18.05.2020


Ответы (1)


Вы можете просто использовать цикл 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 )

Другой вариант по запросу OP

#!/usr/bin/env bash

for d in masterDir/DP*/; do
  while IFS= read -r files; do
    echo Do something with "$files"
  done < <(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 сортировка с использованием . в качестве разделителя полей.

  • <() — это замена процесса, своего рода файла, а именно именованный канал, см. вывод ls -l <(:), а для чтения из файла вам нужен знак перенаправления <, и он должен быть отделен от <( ), иначе вы получите ошибку.

person Jetchisel    schedule 18.05.2020
comment
Прохладный. Спасибо. Не могли бы вы добавить некоторые пояснения, такие как: 1. почему done <<(for d in DP*/; терпит неудачу, 2. роль 2, . в sort -Vk2 -t.? Еще одно замечание: нельзя ли сделать синтаксис похожим на цикл while внутри цикла for? - person massisenergy; 18.05.2020
comment
Вы можете направить вывод на while read loop yes, но он будет в другой подоболочке, и именно так я бы это написал. - person Jetchisel; 18.05.2020
comment
@massisenergy, я обновил ответ вашим циклом while внутри цикла for. - person Jetchisel; 18.05.2020
comment
Я отредактировал несколько частей кода, чтобы они соответствовали ожидаемому результату. - person massisenergy; 19.05.2020