私はこれを参考にしました。同じパターン発生間の Grep ライン、ファイルに分割したくなく、代わりに配列に保存したいと思います。ファイルcount.txt
には以下が含まれます。
0
1
2
3
0
1
2
0
1
私のスクリプトコードは次のとおりです
total=$(sed -n \$= count.txt)
c=0
k=0
lineno=0
var="0"
for i in $(cat count.txt);
do
if ["$i" -eq "$var"]
then
arr[$((k++))]=c
c=0
c=$((c+1))
else
c=$((c+1))
if ["$lineno" -eq "$total"]
then
arr[$((k++))]=c
fi
fi
lineno=$((lineno+1))
done
上記のロジックはC ++言語でテストされており、配列を印刷すると次のように表示されます。0 4 3 2
まず、私のスクリプトは次のエラーを表示しますline 9: [0: command not found
。第二に、上記の出力のように繰り返し回数を配列に保存する効率的な方法はありますか?
答え1
ああ、一行:
awk -v patt="0" -v prev=1 '
$0 ~ patt {print NR - prev; prev = NR}
END {print NR + 1 - prev}
' file
答え2
この試み、
LINES=(`cat count.txt `)
arr=()
arrIndex=0
a=`echo $LINES`
for i in "${!LINES[@]}"; do
if [[ "${LINES[$i]}" = "$a" ]]; then
arr[arrIndex]=`echo "${i}"`
arrIndex=$((arrIndex+1))
fi
done
arr[arrIndex]=`echo ${#LINES[@]}`
arrOut=()
for ((i=1; i<"${#arr[@]}"; ++i))
do
j=`expr $i - 1 `
arrOut[$i]=`echo "${arr[$i]} ${arr[$j]}" | awk '{a=$1-$2;print a}'`
done
echo ${arrOut[@]}