![bash 脚本根据周期数在多个文件上应用 ncrcat](https://linux22.com/image/173774/bash%20%E8%84%9A%E6%9C%AC%E6%A0%B9%E6%8D%AE%E5%91%A8%E6%9C%9F%E6%95%B0%E5%9C%A8%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%8A%E5%BA%94%E7%94%A8%20ncrcat.png)
我有一个仿真模型,可以在多个零件中运行仿真,其中每个零件的输出都是随着循环数的增加而生成的。输出文件可能如下所示:
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
。我曾经对每个文件名(a
通过c
)手动执行此操作,如下所示:
ncrcat a.00{0..2}.nc a.nc
我将如何编写一个 bash 脚本来对所有文件执行 ncrcat 命令并将所有文件以递增的循环数连接起来(so和 to a.000.nc
;a.001.nc
下一个文件将是, , to )?我尽可能使用 等来提取输出中存在哪些循环编号,但不知道如何提取文件名。a.002.nc
a.nc
b.000.nc
b.001.nc
b.002.nc
b.nc
egrep
ls
谢谢!
答案1
给定这样的文件列表(示例中的文件,加上从000
到100
for 的所有数字a
):
$ 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
: 每个前缀只保留一个。while read prefix; do ...; done
:迭代每个前缀。ncrcat "$prefix".*nc "$prefix".nc
:nrcat
对以此前缀开头并以 结尾的所有文件名运行.nc
,$prefix.nc
作为输出文件。