У меня есть данные модели с сеткой (разделенные разной глубиной), сохраненные в текстовых файлах. Структура такая:
Форматкаждого столбца в строке текстового файла:
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
действовать только на следующие числа.