サイクル数に応じて複数のファイルにncrcatを適用するbashスクリプト

サイクル数に応じて複数のファイルにncrcatを適用するbashスクリプト

いくつかの部品でシミュレーションを実行するシミュレーションモデルがあり、ここでサイクル数が増加するにつれて各部品の出力が生成されます。出力ファイルは次のとおりです。

a.000.nc   b.000.nc  c.000.nc
a.001.nc   b.001.nc  c.001.nc
a.002.nc   b.002.nc  c.002.nc

これらのファイルをリンクするには、nco、特にレコードコネクタを使用しますncrcat。私は次のように各ファイル名(apass)に対してc手動でこれを行いました。

ncrcat a.00{0..2}.nc a.nc 

すべてのファイルでncrcatコマンドを実行し、ますます多くのループ(soとto a.000.nc;a.001.nc私は出力にどのループ番号があるかを抽出するためにetcを使用しようとしていますが、ファイル名を抽出する方法がわかりません。a.002.nca.ncb.000.ncb.001.ncb.002.ncb.ncegrepls

ありがとうございます!

答え1

次のファイルのリストが提供されます(例のファイルとの000までのすべての数字を含む)。100a

$ ls
a.000.nc  a.007.nc  a.014.nc  a.021.nc  a.028.nc  a.035.nc  a.042.nc  a.049.nc  a.056.nc  a.063.nc  a.070.nc  a.077.nc  a.084.nc  a.091.nc  a.098.nc  c.001.nc
a.001.nc  a.008.nc  a.015.nc  a.022.nc  a.029.nc  a.036.nc  a.043.nc  a.050.nc  a.057.nc  a.064.nc  a.071.nc  a.078.nc  a.085.nc  a.092.nc  a.099.nc  c.002.nc
a.002.nc  a.009.nc  a.016.nc  a.023.nc  a.030.nc  a.037.nc  a.044.nc  a.051.nc  a.058.nc  a.065.nc  a.072.nc  a.079.nc  a.086.nc  a.093.nc  a.100.nc
a.003.nc  a.010.nc  a.017.nc  a.024.nc  a.031.nc  a.038.nc  a.045.nc  a.052.nc  a.059.nc  a.066.nc  a.073.nc  a.080.nc  a.087.nc  a.094.nc  b.000.nc
a.004.nc  a.011.nc  a.018.nc  a.025.nc  a.032.nc  a.039.nc  a.046.nc  a.053.nc  a.060.nc  a.067.nc  a.074.nc  a.081.nc  a.088.nc  a.095.nc  b.001.nc
a.005.nc  a.012.nc  a.019.nc  a.026.nc  a.033.nc  a.040.nc  a.047.nc  a.054.nc  a.061.nc  a.068.nc  a.075.nc  a.082.nc  a.089.nc  a.096.nc  b.002.nc
a.006.nc  a.013.nc  a.020.nc  a.027.nc  a.034.nc  a.041.nc  a.048.nc  a.055.nc  a.062.nc  a.069.nc  a.076.nc  a.083.nc  a.090.nc  a.097.nc  c.000.nc

あなたはできます:

for f in *.nc; do echo ${f//\.*}; done | sort | uniq | 
    while read prefix; do echo ncrcat "$prefix".*nc "$prefix".nc; done

これにより、次のような出力が生成されます。

ncrcat a.000.nc a.001.nc a.002.nc a.003.nc a.004.nc a.005.nc a.006.nc a.007.nc a.008.nc a.009.nc a.010.nc a.011.nc a.012.nc a.013.nc a.014.nc a.015.nc a.016.nc a.017.nc a.018.nc a.019.nc a.020.nc a.021.nc a.022.nc a.023.nc a.024.nc a.025.nc a.026.nc a.027.nc a.028.nc a.029.nc a.030.nc a.031.nc a.032.nc a.033.nc a.034.nc a.035.nc a.036.nc a.037.nc a.038.nc a.039.nc a.040.nc a.041.nc a.042.nc a.043.nc a.044.nc a.045.nc a.046.nc a.047.nc a.048.nc a.049.nc a.050.nc a.051.nc a.052.nc a.053.nc a.054.nc a.055.nc a.056.nc a.057.nc a.058.nc a.059.nc a.060.nc a.061.nc a.062.nc a.063.nc a.064.nc a.065.nc a.066.nc a.067.nc a.068.nc a.069.nc a.070.nc a.071.nc a.072.nc a.073.nc a.074.nc a.075.nc a.076.nc a.077.nc a.078.nc a.079.nc a.080.nc a.081.nc a.082.nc a.083.nc a.084.nc a.085.nc a.086.nc a.087.nc a.088.nc a.089.nc a.090.nc a.091.nc a.092.nc a.093.nc a.094.nc a.095.nc a.096.nc a.097.nc a.098.nc a.099.nc a.100.nc a.nc
ncrcat b.000.nc b.001.nc b.002.nc b.nc
ncrcat c.000.nc c.001.nc c.002.nc c.nc

これが正しいと仮定し、echoコマンドを削除して再実行して実際にファイルをリンクします。

説明する

  • for f in *.nc; do ...; done:で終わるすべての項目を繰り返します.nc
  • echo ${f//\.*};:最初の項目以降のすべての項目を削除します.。これはプレフィックスとのみa印刷bしますc
  • sort | uniq: 各プレフィックスの 1 つだけが予約されます。
  • while read prefix; do ...; done:各プレフィックスを繰り返します。
  • ncrcat "$prefix".*nc "$prefix".ncnrcatこのプレフィックスで始まり終わるすべてのファイル名に対して出力ファイル.ncとして実行されます。$prefix.nc

関連情報