Netcdfファイルフォルダがあります。このファイルは月に6時間の風ファイルです。すべてのファイルをマージしたいです。時間ごとにファイルを読み込んで結合するシェルスクリプトを作成する方法がわかりません。助けてください。
anal_00z20230118.nc
anal_00z20230119.nc
anal_00z20230120.nc
anal_00z20230121.nc
anal_00z20230122.nc
anal_00z20230123.nc
anal_00z20230124.nc
anal_00z20230125.nc
anal_00z20230126.nc
anal_00z20230127.nc
anal_00z20230128.nc
anal_00z20230129.nc
anal_00z20230130.nc
anal_00z20230131.nc
anal_06z20230118.nc
anal_06z20230119.nc
anal_06z20230120.nc
anal_06z20230121.nc
anal_06z20230122.nc
anal_06z20230123.nc
anal_06z20230124.nc
anal_06z20230125.nc
anal_06z20230126.nc
anal_06z20230127.nc
anal_06z20230128.nc
anal_06z20230129.nc
anal_06z20230130.nc
anal_12z20230118.nc
anal_12z20230119.nc
anal_12z20230120.nc
anal_12z20230121.nc
anal_12z20230122.nc
anal_12z20230123.nc
anal_12z20230124.nc
anal_12z20230125.nc
anal_12z20230126.nc
anal_12z20230127.nc
anal_12z20230128.nc
anal_12z20230129.nc
anal_12z20230130.nc
anal_18z20230118.nc
anal_18z20230119.nc
anal_18z20230120.nc
anal_18z20230121.nc
anal_18z20230122.nc
anal_18z20230123.nc
anal_18z20230124.nc
anal_18z20230125.nc
anal_18z20230126.nc
anal_18z20230127.nc
anal_18z20230128.nc
anal_18z20230129.nc
anal_18z20230130.nc
答え1
GNU awkとzshの使用:
set -o extendedglob
LC_ALL=C gawk '
BEGINFILE {out = gensub(/(.*_)[0-9]{2}z/, "\\1", FILENAME) ".combined"}
{print > out}' ./*_(00|06|12|18)z[0-9](#c8).nc
anal_20230130.nc.combined
各ファイルセットに対して1つずつ作成されますanal_XXz20230130.nc
。
では、同等のbash
グローブパターンが必要です。./*_@(00|06|12|18)z[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789].nc
shopt -s extglob failglob
そして、bash
globzsh
は語彙的に拡張されているため、*_00z*
ファイルは*_06z*
ファイル自体の前に表示され、*_12z*
ファイル自体の前に表示されます*_18z*
。
ファイル数が多い場合、execve()
パラメータ+環境サイズ制限が発生します。「パラメータリストが長すぎます」間違い。
print -rNC1
これは、リストをzshの組み込み関数に渡し(したがってexecve()を含まない)、NULで区切って渡してリストを印刷することで回避できますgawk
。
set -o extendedglob
print -rNC1 ./*_(00|06|12|18)z[0-9](#c8).nc(N) |
LC_ALL=C gawk '
!start {ARGV[ARGC++] = $0; next}
BEGINFILE {out = gensub(/(.*_)[0-9]{2}z/, "\\1", FILENAME) ".combined"}
{print > out}' RS='\0' - start=1 RS='\n'
bash
いいえprint -rNC1
。ただし、次の関数を使用してシミュレートできます。
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
代わりにglob修飾子と同等のものnullglob
を得るために使用してください。failglob
zsh
N
これらの6時間ファイルが行の途中で分割されている場合(たとえば、改行ではなく次に終わりでanal_00z20230130.nc
始まる場合)、結合されたファイルは読み取る各レコードの後に1を追加するので、代わりに偶数これが望むものではないか、ファイルがテキストファイルでない場合。unix.sta
anal_06z20230130.nc
ckexchange.com
unix.sta<newline>ckexchange.com
unix.stackexchange.com
gawk
ORS
print
printf "%s", $0 RT