我有几个文件(表)命名为:institute _
model _
scenario _
river.txt
(institute,model,scenario和river是变量。)我想创建一个for
循环来识别每个具有相同institute名称且同时具有相同scenario名称的文件,以便附加每个不同的结果使用以下命令在同一输出文件中建模:
paste filename1.txt filename2.txt > output_file.txt
我知道如何for
在不同的文件夹而不是文件名上创建循环。有人有想法吗?
作为一个最小的例子,文件名可以如下所示:
wbm_gfdl_rcp8p5_mississippi.txt
wbm_hadgem_rcp8p5_mississippi.txt
matsiro_gfdl_rcp8p5_mississippi.txt
matsiro_ipsl_rcp4p5_mississippi.txt
matsiro_hadgem_rcp4p5_mississippi.txt
matsiro_miroc_rcp8p5_mississippi.txt
然后,我想将以下文件附加在一起:
wbm_gfdl_rcp8p5_mississippi.txt with
wbm_hadgem_rcp8p5_mississippi.txt
matsiro_ipsl_rcp4p5_mississippi.txt with
matsiro_hadgem_rcp4p5_mississippi.txt
matsiro_gfdl_rcp8p5_mississippi.txt with
matsiro_miroc_rcp8p5_mississippi.txt
for
首先,目录循环和文件循环没有区别。这是完全一样的事情。请记住,在 *nix 上,一切皆文件。所以,你的循环将是这样的:
如果您不知道研究所和场景名称,您可以对所有文件运行此命令并从文件名中提取它们(只要您的名称不包含空格):
如果文件都在同一个目录中,您可以:
它在“_”(
-F_
) 上拆分文件名,将变量 i、m、s 设置为文件名的前 3 部分(研究所、模型、场景),并在数组 f 中累积文件名。该数组仅由研究所和场景索引,因此所有模型都被连接起来(不使用 m)。最后的 END 打印 f 数组,并使用索引 (institute_scenario) 作为输出文件的名称。根据您的示例,这会产生然后,您需要将其通过管道传输到 shell 中以执行它。添加
| sh
到上面的最后一行来执行此操作。要从输入文件中删除某些列,您需要更改收集所有输入文件名的 awk 行。在第一行:
文件名是“$0”。例如,如果将此行更改为:
然后您将获得示例输出:
但是如果你只想剪切第二个文件名,那就有点复杂了,你需要这个:
所以你会得到
如果
sh
不理解语法<(cut ...)
,则将其替换为bash
.也许使用 ls 命令。类似的东西
ls $institute_*_$scenario_*.txt
应该返回具有相同机构和场景的所有文件。