如何成对处理文件

如何成对处理文件

我需要成对处理文件。所以如果我有:

00000.nii.gz   
00001.nii.gz
00002.nii.gz
00003.nii.gz 

等等...(nii.gz是成像共振处理过程中使用的扩展)我需要处理文件00000.nii.gz00001.nii.gz一起,然后0002.nii.gz等等00003.nii.gz。对于每个输出,我需要重命名它。

答案1

我假设文件名中的数字是五位数的零填充数字,问题和注释中偶尔出现的四位数字符串是拼写错误。

#!/bin/bash

for (( i = 0; i <= 99999; i += 2 )); do
    name1=$( printf '%05d.nii.gz' "$i" )
    name2=$( printf '%05d.nii.gz' "$(( i + 1 ))" )

    if [ -f "$name1" ] && [ -f "$name2" ]; then
        printf 'Processing "%s" and "%s" together...\n' "$name1" "$name2" >&2
        # use the two files here
    else
        printf '"%s" or "%s" not found, exiting.\n' "$name1" "$name2" >&2
        break
    fi
done

循环从零到一个大数,增量为 2。对于每次迭代,它i在两次调用中使用变量构造两个文件名printf(一次 fori和一次 for i+1)。格式说明%05d符将整数格式化为以零填充的五位数字字符串。

一旦构造的文件名不再对应于任何现有文件(当前目录中),循环就会退出。

如果文件位于当前目录之外的其他目录中,请将printf格式字符串从更改'%05d.nii.gz''/path/to/dir/%05d.nii.gz'.


为了遵守 DRY 原则(“不要重复自己”):

#!/bin/bash

dir='/path/to/dir'
name_fmt="$dir/%05d.nii.gz"

for (( i = 0; i <= 99999; i += 2 )); do
    name1=$( printf "$name_fmt" "$i" )
    name2=$( printf "$name_fmt" "$(( i + 1 ))" )

    if [ -f "$name1" ] && [ -f "$name2" ]; then
        printf 'Processing "%s" and "%s" together...\n' "$name1" "$name2" >&2
        # use the two files here
    else
        printf '"%s" or "%s" not found, exiting.\n' "$name1" "$name2" >&2
        break
    fi
done

答案2

假设您有许多这样的文件:

echo z?
z1 z2 z3 z4 z5 z6 z7 z8 z9

然后要获得情侣,您可以使用:

echo z? | xargs -n2
z1 z2
z3 z4
z5 z6
z7 z8
z9

获得三元组:

echo z? | xargs -n3
z1 z2 z3
z4 z5 z6
z7 z8 z9

xargs 的默认命令是 echo,但您可以提供自己的命令。 xargs 的手册页虽然很长,但最后包含了一些示例。

最美好的祝愿...干杯,drl

相关内容