【发布时间】:2014-11-07 17:52:41
【问题描述】:
我有一个目录,./grd_files/lat36/,其中有 7 个文件(n36e114.grd、n36e115.grd、n36e116.grd、n36e117.grd、n36e118.grd、n36e119.grd、n36e120.grd。也在下面@987654329 @ 是其他文件夹,命名为lat37、lat38、lat39。每个文件夹都包含一些文件,其格式与lat36 中的文件格式相同,只是代替n36e114.grd,文件中的e114 经度lat37 文件夹将被称为 n37e114。现在,并非所有 lat** 文件夹都包含所有经度,但我需要它们。
我已经编写了脚本的一部分来确定哪个 lat** 文件夹中的列最多(它是 lat36,有 7 个经度)。我想将lat36 文件夹中存在的经度与其他文件夹进行比较,如果另一个文件夹中缺少一列,我会做的。我可以处理 if then 语句,但我不知道如何比较 bash 中的列表。
我正在考虑列出row1 文件夹中的文件名,并将其与其他文件夹中的文件进行比较,但名称不会也不应该匹配——只有名称的列部分将并且应该匹配。到目前为止,我已经尝试创建一个文件名数组,然后将其解析为名称的列部分。请注意,这些实际上是地图图块,因此名称实际上是北移(行)和缓动(col)坐标格式,例如n36e114.grd。所以我想隔离名称的所有e114 样式部分并检查并确保它们存在于其他行中。我希望这是有道理的。以下是我尝试过的,但我在 bash 语法方面不是很好,所以我很难过。非常感谢帮忙。
col_list_raw=( $(find $maxdirectory -name ".grd" -exec basename {} .grd \;) )
col_list=( for c in ${col_list_raw[@]}; do echo ${col_list_raw[$c]:3:7}; done )
其中$maxdirectory 是列最多的一个。*
更新:我已经删除了上面斜体中描述的内容,并尝试合并来自 John1024 的解决方案。下面是代码。
cd ./grd_files
for row in lat*/
do
ls "$row" | sed 's/.*lon/lon/' >"${row%/}.tmp"
done
for f in lat*.tmp
do
grep -vFf "$f" ${latXX}.tmp >missing.tmp
[ -s missing.tmp ] && echo ${f%.tmp} is missing $(cat missing.tmp)
done
cd ..
其中latXX 是经度最多的文件夹。 John1024 的第一个循环运行良好,我得到了每个 lat** 文件夹的正确列表,但第二个循环直接比较列表,返回:
lat37 is missing n36e114.grd n36e115.grd n36e116.grd n36e117.grd n36e118.grd n36e119.grd n36e120.grd
lat38 is missing n36e114.grd n36e115.grd n36e116.grd n36e117.grd n36e118.grd n36e119.grd n36e120.grd
lat39 is missing n36e114.grd n36e115.grd n36e116.grd n36e117.grd n36e118.grd n36e119.grd n36e120.grd
我需要该循环来仅比较文件名的部分。即我想检查每个文件夹是否存在每个经度。因此,如果文件 `n37e114.grd' 存在,则不会发生任何事情,但如果它不存在,则返回该信息,我可以根据丢失的文件执行命令。我希望我的编辑能够清除命名约定并且是可以理解的。再次感谢您的帮助。上午
解决方案:
感谢@John1024 的帮助,我找到了解决方案。我已经复制了下面的最终解决方案。在此之后,我读入 *.out 文件并对它们的每一行执行我的命令。
cd ./grd_files
for lat in */
do
ls "$lat" | sed 's/[a-z][1-9][1-9].*\([a-z][0-9][0-9]*\).grd/\1/' >"${lat%/}.tmp"
done
for file in *.tmp
do
lat=$(echo $file | awk -F "." '{print $1}')
grep -vFf "$file" ${xXX}.tmp >${lat}missing.out
[ -s ${lat}missing.out ] && echo ${file%.tmp} is missing $(cat ${lat}missing.out)
done
【问题讨论】:
-
数据示例以及价值 1000 字的想要输出...