我有几个文件(表)名为:研究所_
模型_
方案_
河.txt
(institution,model,scenario和river是变量。)我想创建一个for
循环,该循环将标识具有相同研究所名称和相同场景名称的每个文件,以便附加每个不同的结果使用以下命令在同一输出文件中建立模型:
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
如果文件都在同一目录中,则可以:
ls |
awk -F_ '{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
END{ for(insc in f)
printf "paste%s >out_%s.txt\n",f[insc],insc
}'
它在“ _”(-F_
)上分割文件名,将变量i,m,s设置为文件名的前3个部分(实例,模型,方案),并在文件名数组f中累积。该数组仅按机构和方案建立索引,因此所有模型都已连接在一起(未使用m)。最后一个END打印f数组,并使用索引(institute_scenario)作为输出文件的名称。用你的例子,这产生了
paste wbm_gfdl_rcp8p5_mississippi.txt wbm_hadgem_rcp8p5_mississippi.txt >out_wbm_rcp8p5.txt
paste matsiro_hadgem_rcp4p5_mississippi.txt matsiro_ipsl_rcp4p5_mississippi.txt >out_matsiro_rcp4p5.txt
paste matsiro_gfdl_rcp8p5_mississippi.txt matsiro_miroc_rcp8p5_mississippi.txt >out_matsiro_rcp8p5.txt
然后,您需要将此内容通过管道传递到外壳中以使其执行。添加| sh
到上面的最后一行以执行此操作。
要从输入文件中删除一些列,您需要更改正在收集所有输入文件名的awk行。在第一个awk行中:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
文件名是“ $ 0”。例如,如果将此行更改为:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] sprintf(" <(cut -f4 %s)",$0) }
然后您将获得示例输出:
paste <(cut -f4 wbm_gfdl_rcp8p5_mississippi.txt) <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
但是,如果您只想剪切第二个文件名,则要复杂一些,而您需要这样做:
{ i=$1; m=$2; s=$3;
if(f[i"_"s]=="")add = $0; else add = sprintf("<(cut -f4 %s)",$0);
f[i"_"s] = f[i"_"s] " " add }
所以你会得到
paste wbm_gfdl_rcp8p5_mississippi.txt <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
如果sh
不了解语法,<(cut ...)
则将其替换为bash
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句