通过匹配文件名模式和连接文件内容来搜索文件

时间:2013-08-28 06:15:17

标签: python regex bash sorting concatenation

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

"xaaNP_len_0.fa"

"xaaP_len_0.fa"

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

[xaa, xab....xaj]

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

例如,我想连接所有

P_len_*.fa

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

接下来我想连接所有

NP_len_*.fa

在所有10个目录中以相同的方式汇总文件。

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

xaa/xaaNP_len_0.fa
xab/xabNP_len_0.fa

应该都进入一个名为

的文件
NP_len_0.fa

2 个答案:

答案 0 :(得分:1)

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

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

并且对于您不希望N我们这个

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

此版本将匹配除N之前P之外的所有模式。我认为文件夹名称将来可能会增长xaa部分。你也可以匹配长度为3的字符串。

答案 1 :(得分: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
)