今日の時間ごとのファイルを読んでマージする方法は?

今日の時間ごとのファイルを読んでマージする方法は?

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].ncshopt -s extglob failglob

そして、bashglobzshは語彙的に拡張されているため、*_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を得るために使用してください。failglobzshN

これらの6時間ファイルが行の途中で分割されている場合(たとえば、改行ではなく次に終わりでanal_00z20230130.nc始まる場合)、結合されたファイルは読み取る各レコードの後に​​1を追加するので、代わりに偶数これが望むものではないか、ファイルがテキストファイルでない場合。unix.staanal_06z20230130.ncckexchange.comunix.sta<newline>ckexchange.comunix.stackexchange.comgawkORSprintprintf "%s", $0 RT

関連情報