Both solutions seemed to work for me, as with:
# @(#) s1 Demonstrate cut with character trailing blanks.
set -o nounset
echo "GNU bash $BASH_VERSION" >&2
# echo "zsh version $ZSH_VERSION >&2"
cut --version | head -1 >&2
var="abcd ghij mnop"
with_cut=$( echo "$var" | cut --characters=1-6 )
echo " Results of operations, characters bounded by \"|\":"
echo " Original |$var|, cut |$with_cut|, bash builtin |$with_builtin|"
GNU bash 2.05b.0(1)-release
cut (coreutils) 5.2.1
Results of operations, characters bounded by "|":
Original |abcd ghij mnop|, cut |abcd |, bash builtin |abcd |
You didn't post any code, so it's difficult to diagnose where the problem might be.
If you are dealing with a small number of instances, then the second solution is probably best from an efficiency point-of-view, whereas if you have a large file, then I'd use cut. The latter may also be more portable, although when I invoked bash with "--posix" the script worked correctly ... cheers, makyo