带有文件名的 for 循环

ste*_*eve 4 command-line bash files

我有几个文件(表)命名为:研究所_模型_场景_.txt

机构模型场景河流是变量。)我想创建一个for循环来识别具有相同机构名称和相同场景名称的每个文件,以便附加每个不同的结果模型在同一个输出文件中,使用以下命令:

paste filename1.txt filename2.txt > output_file.txt
Run Code Online (Sandbox Code Playgroud)

我知道如何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
Run Code Online (Sandbox Code Playgroud)

然后,我想将以下文件附加在一起:

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
Run Code Online (Sandbox Code Playgroud)

ter*_*don 6

首先,for目录循环和文件循环没有区别。完全一样。请记住,在 *nix 上,一切都是文件

所以,你的循环会是这样的:

for institute in institute1 institute2 institute3
do
    for scenario in scenario1 scenario2 scenario3
    do
        paste "$institute"_*_"$scenario"* > "$institute"_"$scenario".out
    done
done
Run Code Online (Sandbox Code Playgroud)

如果您不知道机构和场景名称,您可以对所有文件运行此命令并从文件名中提取它们(只要您的名称不包含空格):

for f in *; do echo "${f/_*} ${f##*_}"; done | 
    sort -u | while read ins sce; do 
        paste "$ins"_*_"$sce"* > "$ins"_"$sce".out
    done
Run Code Online (Sandbox Code Playgroud)