Bash: 如何将唯一无数据值的列表变成可以使用的变量?
Bash: how to turn list of unique no data values into variables that can be used?
basepath=Desktop/DEM
dir=(ls -1 type -f)
cd $dir
for f in *.tif; do gdalinfo "$f" | grep -o 'NoData Value\=[-0-9]*' || echo "NoData Value=None"; done > test.txt
cat test.txt | sort | uniq > uniquenodata.txt #this is to find unique no data values in a directory
nodatalist=$(cat uniquenodata.txt)
rightnodata=-9999
我已经制作了上面的 BASH 脚本来找出目录中不同的无数据值。
我的目标是拥有只有一种类型的无数据值的单独文件夹,我需要以某种方式创建一个 for 循环,该循环将转换唯一无数据值列表($nodatalist)并检查每个 tif 的无数据值并将其发送到具有这些无数据值的相应文件夹。我是 BASH 的新手,不知道如何将值列表转换为可在 for 循环中使用的变量。
您可以使用变量间接寻址,一个变量的值是另一个变量的名称
for d in "${nodatalist[@]}"; do
echo "${!d}"
done
如本例所示
declare -a a=("b" "c" "d");
b=1
c=2
d=3
for i in "${a[@]}"; do
echo "name: $i, value: ${!i}"
done
输出:
name: b, value: 1
name: c, value: 2
name: d, value: 3
一种更有效的方法是立即移动文件。如果不存在则创建目标目录。
for f in *.tif; do
i=$(gdalinfo "$f" | grep -o 'NoData Value=[-0-9]*') && d=${i#NoData Value=} || d="None"
mkdir -p "$d"
mv "$f" "$d"/
done
顺便说一句,这些行看起来像是语法错误:
dir=(ls -1 type -f)
cd $dir
如果您有一个以此名称命名的目录,这将有效地 cd test
。也许您实际上是指 find -type f
但这显然不会生成目录(-type f
专门选择不是目录的常规文件)。
basepath=Desktop/DEM
dir=(ls -1 type -f)
cd $dir
for f in *.tif; do gdalinfo "$f" | grep -o 'NoData Value\=[-0-9]*' || echo "NoData Value=None"; done > test.txt
cat test.txt | sort | uniq > uniquenodata.txt #this is to find unique no data values in a directory
nodatalist=$(cat uniquenodata.txt)
rightnodata=-9999
我已经制作了上面的 BASH 脚本来找出目录中不同的无数据值。 我的目标是拥有只有一种类型的无数据值的单独文件夹,我需要以某种方式创建一个 for 循环,该循环将转换唯一无数据值列表($nodatalist)并检查每个 tif 的无数据值并将其发送到具有这些无数据值的相应文件夹。我是 BASH 的新手,不知道如何将值列表转换为可在 for 循环中使用的变量。
您可以使用变量间接寻址,一个变量的值是另一个变量的名称
for d in "${nodatalist[@]}"; do
echo "${!d}"
done
如本例所示
declare -a a=("b" "c" "d");
b=1
c=2
d=3
for i in "${a[@]}"; do
echo "name: $i, value: ${!i}"
done
输出:
name: b, value: 1
name: c, value: 2
name: d, value: 3
一种更有效的方法是立即移动文件。如果不存在则创建目标目录。
for f in *.tif; do
i=$(gdalinfo "$f" | grep -o 'NoData Value=[-0-9]*') && d=${i#NoData Value=} || d="None"
mkdir -p "$d"
mv "$f" "$d"/
done
顺便说一句,这些行看起来像是语法错误:
dir=(ls -1 type -f)
cd $dir
如果您有一个以此名称命名的目录,这将有效地 cd test
。也许您实际上是指 find -type f
但这显然不会生成目录(-type f
专门选择不是目录的常规文件)。