Skip to content

Commit

Permalink
Renamed script.
Browse files Browse the repository at this point in the history
  • Loading branch information
henrywinterbottom-wxdev committed Sep 22, 2023
1 parent 04acac5 commit d595cf5
Showing 1 changed file with 193 additions and 0 deletions.
193 changes: 193 additions & 0 deletions ush/remap_prep.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
#! /usr/bin/env bash

#######
# Script for updating/adding specified netCDF variable metadata
# attribute values.
#
# Syntax:
# remap_prep.sh variable_file input_netcdf output_netcdf
#
# Arguments:
#
# variable_file: ASCII formatted file containing netCDF variables
# and the respective metadata attributes to be
# updated/added; the supported format is as
# follows.
#
# <netCDF variable name> <netCDF metadata attribute name>
# <netCDF metadata values>
#
# An example using the format described above is as follows.
#
# SST coordinates geolon,geolat,time
# uo coordinates geolon_u,geolon_u,time
# vo coordinates geolon_v,geolon_v,time
#
# The example above will perform the following task using this
# script.
#
# * Assign the netCDF metadata attribute `coordinates` for
# variable `SST` the values `geolon,geolat,time` and update
# the `output_netcdf` file path.
#
# * Assign the netCDF metadata attribute `coordinates` for
# variable `uo` the values `geolon_u,geolat_u,time` and update
# the `output_netcdf` file path.
#
# * Assign the netCDF metadata attribute `coordinates` for
# variable `vo` the values `geolon_v,geolat_v,time` and update
# the `output_netcdf` file path.
#
# input_netcdf: The netCDF-formatted file path containing the
# variables defined in `variable_file`.
#
# output_netcdf: A netCDF-formatted file path to contain the
# specified variables remapped to the destination
# grid projection.
#######

# Collect the command line arguments and check the validity.
variable_file="${1}"
input_path="${2}"
output_path="${3}"

#######

if [[ "$#" -ne 3 ]]; then
echo "Usage: $0 <variable_file> <input_path> <output_path>"
exit 100
fi

#######

# _comma_split_string - Split a comma-delimited string into an array.
#
# Description:
# This function takes a comma-delimited string as input and splits
# it into an array. Each element in the resulting array is
# obtained by splitting the input string at commas and then
# removing leading and trailing spaces.
#
# Parameters:
# $1 - The comma-delimited string to split.
#
# Global Variables:
# global_array - An array containing the split elements.
#
# Example usage:
# _comma_split_string "item1,item2 item3,item4"
# for element in "${global_array[@]}"; do
# echo "$element"
# done
#
# This example will split the input string into individual elements
# and print each element on a separate line.
function _comma_split_string() {
local string="${1}"

local local_array=()
global_array=()
IFS="," read -ra items <<< "${string}"
for item in "${items[@]}"; do
local_array+=("${item} ")
done
for item in "${local_array[@]}"; do
IFS=" " read -ra items <<< "${item}"
for element in "${items[@]}"; do
global_array+=("${element} ")
done
done
}

#######

# _strip_whitespace - Remove whitespace from a string.
#
# Description:
# This function takes an input string and removes all whitespace
# characters (spaces, tabs, and newline characters) to produce a
# cleaned output string.
#
# Parameters:
# $1 - The input string from which whitespace will be removed.
#
# Return:
# The cleaned string with no whitespace.
#
# Example usage:
# cleaned_string=$(_strip_whitespace " This is a string with spaces ")
# echo "Cleaned string: \"$cleaned_string\""
#
# This example will remove all leading, trailing, and internal
# whitespace from the input string and display the cleaned result.
function _strip_whitespace(){
local in_string="${1}"

out_string=$(echo "${in_string}" | $(command -v sed) "s/ //g")

Check warning

Code scanning / shellcheck

out_string appears unused. Verify use (or export if used externally). Warning

out_string appears unused. Verify use (or export if used externally).
}

#######

# ncattr_update - Update/add attributes for a variable in a netCDF file.
#
# Description:
# This function updates the specified attribute for a specified
# variable in a netCDF file using the `ncatted` command.
#
# Parameters:
# $1 - The variable name to update.
# $2 - netCDF variable metadata attribute name.
# $3 - The coordinates as a comma-separated string.
#
# Global Variables:
# global_array - An array containing the split coordinates.
# output_path - The path to the output netCDF file.
#
# Example usage:
# ncupdate "variable_name" "coords" "lon,lat,time"
#
# This example updates the `coords` attributes for the specified
# variable and writes the updates to the output netCDF file.
function ncattr_update(){
local varname="${1}"
local ncattr="${2}"
local coords="${3}"

_comma_split_string "${coords}"
coords="${global_array[@]}"

Check warning

Code scanning / shellcheck

Assigning an array to a string! Assign as array, or use * instead of @ to concatenate. Warning

Assigning an array to a string! Assign as array, or use * instead of @ to concatenate.
coords_str="$(echo "${coords}" | $(command -v tr) -s ' ')"
ncattr_str="$(echo "${ncattr}" | $(command -v tr) -s ' ')"
echo "Adding netCDF attribute ${ncattr_str} values ${coords_str} to variable ${varname} metadata and writing to file ${output_path}"
($(command -v ncatted) -O -a "${ncattr_str}","${varname}",c,c," ${coords_str}" "${output_path}" "${output_path}")

Check warning

Code scanning / shellcheck

Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A"B"C"? Warning

Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A"B"C"?
}

#######

start_time=$(date +%s)
_calling_script=$(basename "${BASH_SOURCE[0]}")
start_time_human=$(date -d"@${start_time}" -u)
echo "Begin ${_calling_script} at ${start_time_human}."

# Copy the input file path to the output file path.
echo "Copying file ${input_path} to ${output_path} and preparing for variable updates."
$(command -v cp) "${input_path}" "${output_path}"

# Read the configuration file for the the variables to be updated and
# proceed accordingly.
while IFS= read -r line; do

# Get the attributes for the respective variable.
varname=$(echo "${line}" | $(command -v awk) '{print $1}')

Check notice

Code scanning / shellcheck

Expressions don't expand in single quotes, use double quotes for that. Note

Expressions don't expand in single quotes, use double quotes for that.
ncattr=$(echo "${line}" | $(command -v awk) '{print $2}')

Check notice

Code scanning / shellcheck

Expressions don't expand in single quotes, use double quotes for that. Note

Expressions don't expand in single quotes, use double quotes for that.
coords=$(echo "${line}" | $(command -v awk) '{print $3}')

Check notice

Code scanning / shellcheck

Expressions don't expand in single quotes, use double quotes for that. Note

Expressions don't expand in single quotes, use double quotes for that.

# Update the variable attributes and write the updates to the
# specified output file (see `output_path`).
ncattr_update "${varname}" "${ncattr}" "${coords}"

done < "${variable_file}"

stop_time=$(date +%s)
_calling_script=$(basename "${BASH_SOURCE[0]}")
stop_time_human=$(date -d"@${stop_time}" -u)
echo "End ${_calling_script} at ${stop_time_human}."

0 comments on commit d595cf5

Please sign in to comment.