合并具有相似名称的文件

合并具有相似名称的文件

[![在此处输入图像描述][1]][1]我有以下一组文件:

lh.aparc.DKTatlas40.stats
lh.BA.stats
lh.curv.stats
lh.wg.pct.stats
rh.aparc.DKTatlas40.stats
rh.BA.stats
rh.curv.stats
rh.wg.pct.stats
lh。 aparc.a2009s.stats
lh.aparc.stats
lh.BA.thresh.stats
lh.entorhinal_exvivo.stats
rh.aparc.a2009s.stats
rh.aparc.stats
rh.BA.thresh.stats
rh.entorhinal_exvivo.stats

我想将每个“rh”文件与每个“lh”文件组合例如我需要组合 lh.aparc.DKTatlas40.stats + rh.aparc.DKTatlas40.stats = merge.aparc.DKTatlas40.stats

我该怎么做?

答案1

for lh in lh*; do
    cat "$lh" "rh${lh#lh}" >"merge${lh#lh}"
done

这会将每个lh文件与相应的rh文件连接起来,并将连接的版本保存为merge(后跟lh文件名中的任何内容)。

参数扩展将从 的值的开头${lh#lh}删除字符串(例如转为)。lh$lhlh.BA.stats.BA.stats

答案2

由于您的文件是配对的,因此您可以循环遍历一个文件并凭直觉知道另一个文件的名称:

for f in lh.*; do
    cat "$f" "${f/lh/rh}" > "${f/lh/merge}"
done

上面的循环将为merge.*.stats每个 lh/rh 对创建一个文件。

该构造将用; 替换变量中${var/foo/bar}的第一个实例。我们这样做首先是为了直觉配对文件的名称,然后为串联的合并结果定义文件名。foovarbar

相关内容