Извлечение данных из нескольких файлов netcdf с помощью цикла ncks in for

Я пытаюсь извлечь определенные переменные из файлов netcdf. Следующий код работает, если я применяю его к одному файлу:

ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc

См. также вопрос: Hyperslab 4D-переменной netcdf с использованием ncks для объяснения. Теперь я хочу использовать этот код для нескольких файлов .nc со следующими именами:

20091208000001.nc
20091208000002.nc
20091208000003.nc

Я попробовал следующий цикл:

# !bin/bash
for ((x=1;x<=3;x+=1))
do
ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 2009120800000$x.nc testU.nc
done

я получаю ошибку

ncks: ERROR received 4 filenames; need no more than two

Как заставить цикл извлекать только один файл за раз, а затем добавлять извлеченный вывод из всех файлов в один выходной файл?

Для каждой итерации цикла обрабатывается каждый из файлов от 20091208000001.nc до ..3.nc. Так что это в основном один файл за раз. Что с этим не так

Inian 07.02.2019 11:22

Я не знаю, это должно работать. Вот почему я опубликовал это. Я получаю эту ошибку 4 раза в моем выводе.

Jellyse 07.02.2019 11:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 154
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я вижу пару ошибок в вашем скрипте, но ничего, что могло бы привести к вашей реальной ошибке.

  • Строка shebang не должна содержать пробел, а путь должен быть абсолютным
  • В условии for есть запятая, которая должна быть точкой с запятой.

    #!/bin/bash
    
    for ((x=1;x<=3;x+=1))
    do
        ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 2009120800000$x.nc testU.nc
    done
    

Когда я добавляю echo к команде, которую вы хотите запустить, я получаю такой результат:

ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc
ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000002.nc testU.nc
ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000003.nc testU.nc

Три вызова с одним файлом каждый. Этот код работает. Похоже, есть что-то еще. Вы упрощаете свой код или показываете нам полный код?

Я исправил ошибки, все та же ошибка. Я использую bash namescript.sh для его запуска.

Jellyse 07.02.2019 11:28

@Jellyse Я обновил свой ответ полученным результатом.

Poshi 07.02.2019 14:19

Это буквально мой полный код в файле testing.sh. В папке есть только эти три файла и файл testing.sh. Возможно ли, что nco неправильно установлен?

Jellyse 07.02.2019 14:33

Хорошо, я переустановил его, все еще та же ошибка. Единственное, что я могу придумать, так это то, что где-то на моем компьютере есть еще один файл с таким же именем, и поэтому он запутался.

Jellyse 07.02.2019 14:50

@Jellyse, добавьте echo к своей команде (echo ncks -C......) и проверьте вывод. Наличие других файлов с таким же именем на компьютере не должно вызывать эту ошибку.

Poshi 07.02.2019 14:58

Я получаю то же самое, что и вы, когда делаю echo ncks... (без ошибок), но файл testU.nc не создается.

Jellyse 07.02.2019 15:10

Нет, с echo вы получаете команду, которая будет выполнена, но она не выполняется, поэтому не создается результат. Если вы получаете тот же вывод, что и я, это означает, что он генерируется правильно. Что происходит, когда вы запускаете одну из этих команд в одиночку? Попробуйте просто запустить ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc. Вы получили такое же сообщение об ошибке?

Poshi 07.02.2019 15:20

это работает просто отлично, когда я это делаю. Приятно иметь мой testU.nc с данными, которые мне нужны. Спасибо, что помогли мне, кстати.

Jellyse 07.02.2019 16:18

Это не имеет смысла. Не должно быть никакой разницы между запуском команды самостоятельно или предоставлением цикла выполнить ее за вас. Это одна и та же команда. Последнее, что я не могу посоветовать, это то, что вы set -x перед циклом, запустите его и внимательно проверьте вывод отладки. Поведение, которое вы описываете, не может быть воспроизведено и концептуально также не имеет смысла :-/

Poshi 07.02.2019 16:37
Ответ принят как подходящий

Я считаю, что слова ni_u,234,235,1 были ошибочно приняты за другое имя файла. Перед этим вам понадобится еще один -d.

И если вы обрабатываете несколько файлов nc, вы можете переименовать testU.nc, чтобы они не перекрывались, или вы можете использовать ncrcat для объединения в один файл. Например.

ncrcat -C -F -d nj_u,151,152,1 -d ni_u,234,235,1 -v vel_u 2009120800000?.nc testU.nc

Если бы это было причиной (что имеет смысл, кстати), то утверждение, сделанное в вопросе о том, что код отлично работает вне цикла, было бы ложным :-(

Poshi 08.02.2019 15:16

@Poshi да, я знаю, накануне все работало нормально, я не видел, чтобы -d отсутствовал. Урок выучен ...

Jellyse 08.02.2019 16:06

Вот почему я просил вас повторно запустить команду, и я написал точную команду, которую вы должны были проверить, чтобы вы просто вырезали и вставляли и проверяли, что утверждение верно. Кстати, было бы неплохо исправить вопрос, чтобы ответ имел смысл.

Poshi 08.02.2019 16:22

@Packard прав в обоих случаях. Более того, шаг 1 используется по умолчанию и поэтому не нужен. Следовательно

ncrcat -C -F -d nj_u,151,152 -d ni_u,234,235 -v vel_u 2009120800000${x}.nc testU${x}.nc

Я отредактировал приведенный выше код в соответствии с нужными размерами (широта, долгота).

ncrcat -C -F -d nj_u,151,152,1 -d ni_u,234,235,1 -v vel_u 2009120800000?.nc testU.nc

а отзыв был такой:

HINT: If operation fails, try multislabbing (http://nco.sf.net/nco.html#msa) wrapped dimension using ncks first, and then apply ncrcat to the resulting file

Другие вопросы по теме