我目前正在尝试合并规则目录中所有 .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个文件执行此操作,以便我可以简单地添加到目录并从此脚本重建。显然它将是很多组合!
答案 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