带文件名的循环

史蒂夫

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

institutionmodelscenarioriver是变量。)我想创建一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带文件名的循环

来自分类Dev

使gstreamer循环文件名

来自分类Dev

For循环写入文件名

来自分类Dev

For循环读取文件名

来自分类Dev

XmlDocument文件名带空格

来自分类Dev

带文件名的*表示什么?

来自分类Dev

带波浪号“〜”的文件的全局gitignore(文件名末尾)

来自分类Dev

带波浪号“〜”的文件的全局gitignore(文件名末尾)

来自分类Dev

具有文件名配对的For循环

来自分类Dev

循环生成文件名

来自分类Dev

循环更改文件名c#

来自分类Dev

“带文件名的文件 B”减去/不带“带文件名的文件 A”又名“A 中删除了什么”?

来自分类Dev

何时使用带文件名或文件名的字符串作为构造函数的参数?

来自分类Dev

处理Makefile中带括号的文件名

来自分类Dev

使用python请求文件名捕获工具带

来自分类Dev

批处理脚本在带括号的文件名上失败

来自分类Dev

如何处理带空格的文件名?

来自分类Dev

带外壳的watch命令无法识别文件名

来自分类Dev

带外壳的watch命令无法识别文件名

来自分类Dev

使用python捕获文件名请求工具带

来自分类Dev

grep -l输出带空格的文件名

来自分类Dev

md5sum弄乱了带空格的文件名

来自分类Dev

如何查找带空格的文件名的非空格版本

来自分类Dev

Onedrive业务上载API:带空格的文件名变为+

来自分类Dev

Basename 无法接收带破折号的文件名

来自分类Dev

在 tcl 中复制文件名(带通配符)

来自分类Dev

从find中提取文件名列表,包括带空格的文件名

来自分类Dev

awk以文件名代替for循环中的文件

来自分类Dev

AVConv循环问题与输出文件名