Извлечение данных из нескольких файлов netcdf с помощью ncks в цикле 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

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


person Jellyse    schedule 07.02.2019    source источник
comment
Для каждой итерации цикла обрабатывается каждый из файлов от 20091208000001.nc до ..3.nc. Таким образом, это в основном один файл за раз. Что с этим не так   -  person Inian    schedule 07.02.2019
comment
Я не знаю, должно ли это сработать. Поэтому я и разместил это. Я получаю эту ошибку 4 раза в своем выводе.   -  person Jellyse    schedule 07.02.2019


Ответы (4)


Я считаю, что слова 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
person Packard CPW    schedule 07.02.2019
comment
Если бы это была причина (что имеет смысл, кстати), то утверждение, сделанное в вопросе о том, что код работает нормально вне цикла, было бы ложным :-( - person Poshi; 08.02.2019
comment
@Poshi да, я знаю, накануне все работало нормально, я не видел пропадания -d. Урок выучен ... - person Jellyse; 08.02.2019
comment
Это причина, по которой я просил вас повторно запустить команду, и я написал точную команду, которую вы должны были протестировать, чтобы вы просто скопировали и вставили и проверили, что утверждение истинно. Кстати, было бы неплохо исправить вопрос, чтобы ответ имел смысл. - person Poshi; 08.02.2019

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

  • Строка 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

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

person Poshi    schedule 07.02.2019
comment
Исправил ошибки, все та же ошибка. Я использую bash namescript.sh для его запуска. - person Jellyse; 07.02.2019
comment
@Jellyse Я обновил свой ответ полученным результатом. - person Poshi; 07.02.2019
comment
Это буквально мой полный код в файле testing.sh. В папке находятся только эти три файла и файл testing.sh. Возможно ли, что nco неправильно установлен? - person Jellyse; 07.02.2019
comment
Хорошо, я переустановил его, все та же ошибка. Единственное, что я могу придумать, это то, что где-то на моем компьютере есть другой файл с таким же именем и поэтому он запутался. - person Jellyse; 07.02.2019
comment
@Jellyse, добавьте echo к вашей команде (echo ncks -C......) и проверьте результат. Наличие на компьютере других файлов с таким же именем не должно вызывать эту ошибку. - person Poshi; 07.02.2019
comment
Я получаю то же самое, что и вы, когда делаю echo ncks ... (без ошибок), но файл testU.nc не создается. - person Jellyse; 07.02.2019
comment
Нет, с echo вы получаете команду, которая будет выполняться, но не выполняется, поэтому результат не создается. Если вы получаете тот же результат, что и я, это означает, что он создается правильно. Что произойдет, если вы запустите одну из этих команд в одиночку? Попробуйте просто запустить ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc. Вы получили такое же сообщение об ошибке? - person Poshi; 07.02.2019
comment
он отлично работает, когда я так делаю. Хорошо, мой testU.nc с данными, которые мне нужны. Кстати, спасибо за помощь. - person Jellyse; 07.02.2019
comment
Это не имеет смысла. Не должно быть никакой разницы между выполнением команды самостоятельно или предоставлением цикла выполнения ее за вас. Это та же команда. Последнее, что я не могу посоветовать, это то, что вы set -x перед циклом, запустите его и внимательно проверьте вывод отладки. Поведение, которое вы описываете, не может быть воспроизведено и концептуально не имеет смысла: - / - person Poshi; 07.02.2019

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

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

person Charlie Zender    schedule 07.02.2019

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

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

и обратная связь была такой:

ПОДСКАЗКА: Если операция завершилась неудачно, попробуйте использовать мультислэббинг (http://nco.sf.net/nco.html#msa) сначала с помощью ncks, а затем примените ncrcat к полученному файлу.

person user12920237    schedule 18.02.2020