여러 부품에서 시뮬레이션을 실행하는 시뮬레이션 모델이 있는데, 여기서 사이클 수가 증가함에 따라 각 부품의 출력이 생성됩니다. 출력 파일은 다음과 같습니다.
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
pass )에 대해 c
수동으로 이 작업을 수행했습니다.
ncrcat a.00{0..2}.nc a.nc
모든 파일에서 ncrcat 명령을 실행하고 점점 더 많은 수의 루프(so 및 to a.000.nc
; a.001.nc
다음 파일은 , to )로 모든 파일을 연결하는 bash 스크립트를 어떻게 작성합니까? 출력에 어떤 루프 번호가 있는지 추출하기 위해 etc를 사용하려고 최선을 다했지만 파일 이름을 추출하는 방법을 모르겠습니다.a.002.nc
a.nc
b.000.nc
b.001.nc
b.002.nc
b.nc
egrep
ls
감사해요!
답변1
다음과 같은 파일 목록이 제공됩니다(예제의 파일과 에 대한 000
까지 의 모든 숫자 포함 ).100
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