BASH SCRIPT:结合目录中的内容排列

时间:2016-07-09 07:26:04

标签: linux bash algorithm

我目前正在尝试合并规则目录中所有 .rule 文件的内容。

例如:

<section class="list_container">
                    <div>

这些文件中的每一个都有大约1,000条规则。我需要编写一个bash脚本,可以输出每个规则的所有排列。

对于所有单曲,它只是:

./rules
    ./numbersFirst.rule
    ./numbersLast.rule
    ./lettersFirst.rule
    etc.

有没有办法以编程方式巧妙地做到这一点?例如:

cat rules/*.rule >> ruleSet

3个,4个...... n个文件的排列怎么样,每个文件有1000行?理想情况是以编程方式对n个文件执行此操作,以便我可以简单地添加到目录并从此脚本重建。显然它将是很多组合!

1 个答案:

答案 0 :(得分:1)

如果可以,您可以使用GNU parallel计算笛卡尔积:

#!/bin/bash

YOUR_DIR="./rules"

ARGS="::: "
NUM=0
for file in $YOUR_DIR/*.rule; do
    ARGS="$ARGS $(cat $file | tr "\n" " ") ::: "
    NUM=$((NUM+1))
    INDEX="$INDEX {$NUM}"
done

if [ ! -z "$ARGS" ]; then
    parallel --no-notice -P1 echo $INDEX $ARGS
fi

或仅通过关联数组重现:

#!/bin/bash

dim=()

YOUR_DIR="./rules"
NUM=0

for file in $YOUR_DIR/*.rule; do
    ARGS="$(cat $file | tr "\n" " ")"
    dim[$NUM]="$ARGS"
    NUM=$((NUM+1))
done

for i in "${!dim[@]}"
do
  echo "key  : $i"
  echo "value: ${dim[$i]}"
done

function iterate {

    local index="$2"

    if [ "${index}" == "${#dim[@]}" ]; then

        for (( i=0; i<=${index}; i++ ))
        do
            echo -n "${items[$i]} "
        done
        echo ""
    else
        for element in ${dim[${index}]}; do
            items["${index}"]="${element}"
            local it=$((index+1))
            iterate items[@] "$it"
        done
    fi
}

declare -a items=("")
iterate "" 0

您可以找到概括here