Извлечь значения из имени файла и добавить их в текстовый файл

Извлечь значения из имени файла и добавить их в текстовый файл

У меня есть данные модели с сеткой (разделенные разной глубиной), сохраненные в текстовых файлах. Структура такая:

Форматкаждого столбца в строке текстового файла:

x_coordinate y_coordinate density

В каждом текстовом файле содержится около 400*400 точек (в виде плоскости определенной глубины).

Имя файла:

dep###

Здесь, ###это число представляет глубину (в направлении Z). Число может быть целым или дробным. Например, сейчас у меня есть эти файлы: "dep0", "dep0.5", "dep10", "dep300", что означает, что эти данные представляют собой данные сетки 400*400 в форме плоскости xy для глубины 0, 0.5, 10 и 300.

Теперь я хотел бы взять число в имени файла (т.е. глубину) и добавить его в третий столбец каждой строки, объединить их все вместе. Также глубина должна быть отсортирована от минимума к максимуму. Таким образом, выходной файл должен выглядеть так (например):

x_coordinate y_coordinate z_coordinate density
0            0            0            2.5
0            1            0            2.5
...          ...          0            2.6
400          400          0            2.9
0            0            0.5          2.8
...          ...          0.5          2.9
0            0            10           3.2
...          ...          10           3.3
...          ...          300          4.7
...          ...          300          4.8

Сначала я делал это с помощью этого скрипта:

for((i=$depmin;i<=$depmax;i++))
do
 if [ -f "xyp/dep"$i ];then
  awk '{print $1, $2,'$i',$3}' "xyp/dep"$i >> "xyzp/area1"
 fi
done

Затем я понял, что он пропустит все файлы, глубина которых не является целым числом, посколькупеременная $iв forцикле увеличивайте на 1 в каждом раунде.

Я пробовал использовать sedи find -exec, но я продолжал получать ошибки. Трудность для меня в том, что я не совсем понимаю, как правильно использовать $, '', <<<для перенаправления или передачи значения в awkили другую функцию. Пожалуйста, помогите мне с этой проблемой.

=====================

Я придумал такой сценарий:

depnumbers=$(ls xyp | sed -e 's/dep//g' |sort -n)
filecount=$(ls xyp | wc -l)

for((i=1;i<=$filecount;i++))
 do
  dep=$(awk '{print $'$i'}' <<< $depnumbers)
  awk '{print $1, $2,'$dep',$3}' "xyp/dep"$dep >> "xyzp/area1"
 done

Работает просто отлично. Есть ли способ упростить или улучшить этот скрипт для такой задачи? На самом деле я новичок в bash и все еще думаю, что что-то не так... не уверен

решение1

Только для добавления чисел в файл.

awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' xyp/dep* > "xyzp/area1"

Для сортировки по номерам.

ls -1v xyp/dep* | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"

Для сортировки от минус чисел.

 ls xyp/dep* | sort -t 'p' -k 3 -n | xargs awk 'NR>1{print $1,$2,substr(FILENAME,7),$4 }' > "xyzp/area1"

В этом случае символ будет рассматриваться pкак разделитель, и функция будет sort -nдействовать только на следующие числа.

Связанный контент