Ваше второе поле содержит пробелы.Эффект вашего первоначального сценария awk в основном заключается в замене разделителей полей пробелами, поэтому $abort_reason
становится вторым пробелом в строке слова .Обратите внимание:
$ cat y.dat
a_b_c|two words|123
one_two|more words|234
$ awk -F'|' '{print $1,$2,$3}' y.dat
a_b_c two words 123
one_two more words 234
$ awk -F'|' '{print $1,$2,$3}' y.dat | while read a b c; do echo "$b"; done
two
more
по сравнению с использованием только bash и заполнением массива для более простого управления:
$ while IFS='|' read -a a; do declare -p a; done < y.dat
declare -a a=([0]="a_b_c" [1]="two words" [2]="123")
declare -a a=([0]="one_two" [1]="more words" [2]="234")
Если вы действительно хотите использовать awk для разделения полей, вам необходимо убедиться, чтоваш вывод не содержит разделитель полей в середине поля.Например:
$ awk -F'|' '{gsub(/ /,"_"); print $1,$2,$3}' y.dat
a_b_c two_words 123
one_two more_words 234
$ awk -F'|' '{gsub(/ /,"_"); print $1,$2,$3}' y.dat | while read red green blue; do echo "$green"; done
two_words
more_words