1

我有 10 个文件夹,其中包含格式如下的文件

"xaaNP_len_0.fa"

或者

"xaaP_len_0.fa"

“xaa”部分对于它所在的文件夹是唯一的。文件夹被命名

[xaa, xab....xaj]

我想将所有匹配特定模式的文件连接在一起。

例如,我想连接所有

P_len_*.fa

其中 * 是从 0 到 100 的整数。这不应包括“P”左侧有“N”的情况。

接下来我想连接所有

NP_len_*.fa

在所有 10 个目录中以相同的方式将文件放在一起。e

文件的结构是扁平的。例如

xaa/xaaNP_len_0.fa
xab/xabNP_len_0.fa

应该都进入一个名为

NP_len_0.fa
4

2 回答 2

1

对于第二种NP_len_*.fa模式,regex可以像

.+NP_len_\d{1,3}.fa

对于第一个你不想要N我们的

.+?[^N]P_len_\d{1,3}.fa

这将匹配除N之前的所有模式P。我已经考虑到文件夹名称将来可能会增加关于您的xaa部分。您也可以匹配长度为 3 的字符串。

于 2013-08-28T06:21:16.847 回答
1

试试这个脚本:

#!/bin/bash

NEXT=''

for (( ;; )); do
    if [[ -n $NEXT ]]; then
        LINE=$NEXT
        NEXT=''
    else
        read LINE || break
    fi

    FILES=("$LINE")
    FORMAT=${LINE#???/???}

    while read LINE; do
        if [[ $LINE == ???/???"$FORMAT" ]]; then
            FILES+=("$LINE")
        else
            NEXT=$LINE
            break
        fi
    done

    echo "Concatenating ${FILES[*]} to $FORMAT."

    cat "${FILES[@]}" > "$FORMAT"
done < <(
    find xa?/ -mindepth 1 -maxdepth 1 -type f -name '???P_len_*.fa' | sort -k 1.14 -n
    find xa?/ -mindepth 1 -maxdepth 1 -type f -name '???NP_len_*.fa' | sort -k 1.15 -n
)
于 2013-08-28T09:24:55.543 回答