주기 수에 따라 여러 파일에 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다음 파일은 , to )로 모든 파일을 연결하는 bash 스크립트를 어떻게 작성합니까? 출력에 어떤 루프 번호가 있는지 추출하기 위해 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: 각 접두사 중 하나만 예약됩니다.
  • while read prefix; do ...; done: 각 접두사를 반복합니다.
  • ncrcat "$prefix".*nc "$prefix".nc: nrcat이 접두사로 시작하고 끝나는 모든 파일 이름에 대해 출력 파일 .nc로 실행됩니다.$prefix.nc

관련 정보