Я пытаюсь извлечь определенные переменные из файлов 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
Как заставить цикл извлекать только один файл за раз, а затем добавлять извлеченный вывод из всех файлов в один выходной файл?
Я не знаю, это должно работать. Вот почему я опубликовал это. Я получаю эту ошибку 4 раза в моем выводе.





Я вижу пару ошибок в вашем скрипте, но ничего, что могло бы привести к вашей реальной ошибке.
В условии 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 Я обновил свой ответ полученным результатом.
Это буквально мой полный код в файле testing.sh. В папке есть только эти три файла и файл testing.sh. Возможно ли, что nco неправильно установлен?
Хорошо, я переустановил его, все еще та же ошибка. Единственное, что я могу придумать, так это то, что где-то на моем компьютере есть еще один файл с таким же именем, и поэтому он запутался.
@Jellyse, добавьте echo к своей команде (echo ncks -C......) и проверьте вывод. Наличие других файлов с таким же именем на компьютере не должно вызывать эту ошибку.
Я получаю то же самое, что и вы, когда делаю echo ncks... (без ошибок), но файл testU.nc не создается.
Нет, с echo вы получаете команду, которая будет выполнена, но она не выполняется, поэтому не создается результат. Если вы получаете тот же вывод, что и я, это означает, что он генерируется правильно. Что происходит, когда вы запускаете одну из этих команд в одиночку? Попробуйте просто запустить ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc. Вы получили такое же сообщение об ошибке?
это работает просто отлично, когда я это делаю. Приятно иметь мой testU.nc с данными, которые мне нужны. Спасибо, что помогли мне, кстати.
Это не имеет смысла. Не должно быть никакой разницы между запуском команды самостоятельно или предоставлением цикла выполнить ее за вас. Это одна и та же команда. Последнее, что я не могу посоветовать, это то, что вы set -x перед циклом, запустите его и внимательно проверьте вывод отладки. Поведение, которое вы описываете, не может быть воспроизведено и концептуально также не имеет смысла :-/
Я считаю, что слова 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 да, я знаю, накануне все работало нормально, я не видел, чтобы -d отсутствовал. Урок выучен ...
Вот почему я просил вас повторно запустить команду, и я написал точную команду, которую вы должны были проверить, чтобы вы просто вырезали и вставляли и проверяли, что утверждение верно. Кстати, было бы неплохо исправить вопрос, чтобы ответ имел смысл.
@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
Для каждой итерации цикла обрабатывается каждый из файлов от 20091208000001.nc до ..3.nc. Так что это в основном один файл за раз. Что с этим не так