如何在 shell 中的变量中存储行块



>我有一个包含 10000+ 行的文本文件,其中包含 chr 和每行的值。我需要此信息来运行程序(下面称为TOOL(。文本文件mylist19.list如下所示:

chr1 1 12
chr1 14 34
chr1 44 65
chr1 48 88
chr1 88 93
chr1 122 144

我想在一批 99 行中运行它。这就是我所做的:

file="/scratch/mylist19.list" 
start=1
diff=99
LASTline=$(cat $file | wc -l)
while [ ${start} -le ${LASTline} ]; do
CHUNK=sed -n `expr ${start},${diff}p` ${file}
echo ${CHUNK}
#TOOL --use ${CHUNK}
start=$((${start}+${diff}))
done < ${file}

那么如何将sed -n expr ${start},${diff}p;${LASTline}q ${file}的输出存储在CHUNK中,以便我可以在TOOL命令中使用它呢?另外,我想在最后一个块中包含$LASTline

我不确定sed但由于这被标记为bash这里是一个没有sed的解决方案,可能会做你想要的。

#!/usr/bin/env bash
diff=99
file="/scratch/mylist19.list" 
while mapfile -n "$diff" -t array && (( ${#array[*]} )); do
chunk=("${array[@]}" "$file")
echo "${chunk[@]}"
echo tool --use "${chunk[@]}"
done < "$file"

另外,我想在最后一个块中包含$LASTline。

类似的东西

#!/usr/bin/env bash
diff=99
file="/scratch/mylist19.list"
total=$(wc -l < "$file")
while mapfile -n "$diff" -t array && (( ${#array[*]} )); do
(( count += ${#array[*]} ))
if (( total != count )); then
chunk=("${array[@]}" "$file") 
else
chunk=("${array[@]}" "$file" "$total")
fi
echo "${chunk[@]}"
echo tool --use "${chunk[@]}"
done < "$file"

使用 sed,只需对脚本进行一些更改:

file="/scratch/mylist19.list"
start=1
diff=99
end=0
LASTline=$(cat $file | wc -l)
while [ ${start} -le ${LASTline} ]; do
end=$((${end}+${diff}))
CHUNK=$(sed -n "${start},${end}p" ${file})
echo ${CHUNK}
#TOOL --use ${CHUNK}
start=$((${start}+${diff}))
done
CHUNK+=$'n'"$LASTline"
echo "${CHUNK}"

最新更新