Intereting Posts
Как эхо «одиночная кавычка» при использовании одиночной кавычки для обертывания специальных символов в оболочке? Команда Awk не работает должным образом Другой вопрос об исключении строки Bash (с использованием эха) Вызывать git без загрузки пользователя gitconfig GNOME 3.22 – Отключить F1 Help Key как перенаправить весь UDP-трафик на VPN-клиент VPN с помощью UFW Используя tc, я хочу, чтобы TCP и UDP использовали один и тот же буфер От имени файла получите имена точек монтирования, устройства, LV, VG, PV DIY: как сделать двухслойный установочный DVD? Как разрешить запуск su сразу после того, как я добавил пользователя в соответствующую группу Извлечение частей текста с помощью sed, awk Как выполнить cgi, на который указывает символическая ссылка? linux cron: хотите создать резервную копию папки Как сохранить подсказку в фоновом режиме? Проблемы с libGL на Fedora 20 – невозможно загрузить драйвер?

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

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

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

x_coordinate y_coordinate density 

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

Имя файла :

 dep### 

Здесь ### – это число, представляющее глубину (в направлении Z). Число может быть целым числом или дроби. Например, теперь у меня есть эти файлы: «dep0», «dep0.5», «dep10», «dep300», что означает, что эти данные составляют 400 * 400 данных с сеткой в ​​формате xy plane для глубины 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 и все еще думаю, что что-то не так … не уверен

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

 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 влиять только на следующие числа.