I am not quite sure what you are trying to do, but one issue which can come up is getting awk to print out what ls considers to be the last field, but which awk does not consider to be so (via its default parsing). eg.
-rw-r--r-- | 433k | filename-with-no-spaces
-rw-r--r-- | 1k | link containing spaces -> /home/user/filename-with-no-spaces
Somehow you need to isolate the last ls field. The approach taken below, is to find the length of all preceding fields and delilimiter. The rest is the filename field (plus other info, like a link's target).
The script below determines the maximum width of the variable-width size field (needed for output formatting). There are multiple ways to get this width; eg. (1) use awk to process each line of ls output ,in the main loop, adding each line to an array for subequent END{ } processing. or (2) write the output of ls to a temporary file, and then have awk process that file. The method shown below uses (2).
Note that the output of ls can send some perhaps unexpected, non-simple, outpt your way, as in the case of a link, so it is generally safer to use find and customize it's output to better suit your parsing needs.
f=7 # the number of (multi-space) delimiters before the start of the filename
myls="$(mktemp)" # a temp file to hold output from `ls`
w=$(ls --color=always -lFHk ~/ |tee "$myls" |awk '{print $5}' |wc -L) # max width of size field
h=k # size unit
awk --re-interval -v"f=$f" -v"w=$w" -v"h=$h" '
NF >= f {
regex = "^([^ ]+ +){"f"}"
match( $0, regex ) # find start of name field
printf( "%s | %"w"s%s | %s\n", $1, $5, h, substr( $0, RLENGTH ))
}' "$myls"
rm "$myls"