シェルスクリプトで順序を変更せずにリストする方法は?

シェルスクリプトで順序を変更せずにリストする方法は?

1979年から2018年までの日々のデータが入ったncファイルがいっぱいのフォルダがあります。 1つの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使用し、2番目、3番目、4番目のフィールド()を数値で並べ替えるように指示します。_-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

テストを経てうまく機能しました

関連情報