>我有一个包含 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}"