如何在shell脚本中不改变顺序地列出?

如何在shell脚本中不改变顺序地列出?

我有一个文件夹,里面装满了 1979 年至 2018 年每日数据的 nc 文件。我希望将其全部合并到一个 NC 中,但是当我尝试列出文件以创建 ferret 脚本时,顺序发生了更改。我在下面给出了我的数据文件名称的示例。

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

当我列出它们时,日期正在更改我尝试使用 shell 脚本中的代码来使用命令更改文件的名称sed

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

有人可以在这方面帮助我吗?

答案1

请注意,对于 GNU ls,如果您传递-v选项 (版本sort),这些文件将按时间顺序列出。

如果您使用nglob 限定符(或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如果满意,请删除(试运行))

用sl来 ef-pad到这些月份和日期0的宽度。2

答案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

测试并运行良好

相关内容