쉘 스크립트에서 순서를 변경하지 않고 나열하는 방법은 무엇입니까?

쉘 스크립트에서 순서를 변경하지 않고 나열하는 방법은 무엇입니까?

1979년부터 2018년까지의 일일 데이터가 담긴 nc 파일이 가득한 폴더가 있습니다. 하나의 NC로 통합하고 싶은데 페렛 스크립트를 생성하기 위해 파일을 나열하려고 하면 순서가 바뀌네요. 아래에 데이터 파일 이름의 예가 나와 있습니다.

ERA5_2018_9_12_UVP.nc
ERA5_2018_9_13_UVP.nc
ERA5_2018_9_14_UVP.nc
ERA5_2018_9_15_UVP.nc
ERA5_2018_9_16_UVP.nc
ERA5_2018_9_17_UVP.nc
ERA5_2018_9_18_UVP.nc
ERA5_2018_9_19_UVP.nc
ERA5_2018_9_1_UVP.nc
ERA5_2018_9_20_UVP.nc
ERA5_2018_9_21_UVP.nc
ERA5_2018_9_22_UVP.nc
ERA5_2018_9_23_UVP.nc
ERA5_2018_9_24_UVP.nc

날짜를 나열할 때 날짜가 변경됩니다. 명령을 사용하여 파일 이름을 변경하기 위해 쉘 스크립트의 코드를 사용하려고 합니다 sed.

ls *.nc >temp
    for i in {1..9..1}
    do
    sed "s/_${i}_UVP/_0${i}_/g"
    done < temp

누구든지 도와줄 수 있나요?

답변1

GNU의 ls경우 -v옵션(버전정렬), 파일은 시간순으로 나열됩니다.

n다음과 같이 glob 한정자(또는 numericglobsort옵션) 를 사용하는 경우에도 동일합니다 zsh.

combine-nc-files ./*.nc(n)

이제 이름을 바꾸려면 zsh다음을 사용하고 수행할 수 있습니다.

autoload -Uz zmv # best in ~/.zshrc
zmv -n '(*_<1979-2018>_)(<1-12>)_(<1-31>)(_UVP.nc)' \
       '$1${(l[2][0])2}_${(l[2][0])3}$4'

( -n만족하면 삭제(시운전))

s를 사용하여 해당 월과 일의 너비를 lef-pad로 설정합니다 .02

답변2

당신이 겪고있는 문제는 파일의 순서입니다. ls알파벳순으로 정렬하되 다르게 정렬하고 싶습니다.

ls *.nc |sort  -t_ -k2 -k3 -k4 -n

필드 구분 기호로 sort사용 하고 두 번째, 세 번째, 네 번째 필드( )를 숫자로 정렬하도록 지시합니다 ._-n

답변3

#!/usr/bin/python
import os
import glob
file=[]
arr=[]
for i in glob.glob('*.nc'):
    file.append(i.strip())

for g in file:
    arr.append(g.split('_')[3])
arr.sort()

for er in arr:
    for nh in file:
        p=nh.split('_')[3]
        if (p == er ):
            print nh

테스트를 거쳐 잘 작동함

관련 정보