Строковые значения в |Разграниченные поля разбиваются вправо в awk - PullRequest
0 голосов
/ 27 сентября 2018

При чтении 2-го столбца из данного файла у меня возникают проблемы при чтении нескольких столбцов с использованием awk из данного файла.При чтении столбца 2 содержимое смещается вправо.

/home/Binay/bin] 82#head -2 /data/xyz/serial/fep_xyz/temp/./xyz_reject_file_details_20180926194730.dat
309_body_mass_index_at_refresh.ABORT.2018-05-13.dat_SKIP_AT|Failed MBR_KEY Lookup|94
309_disease_management_member_activity_at_refresh.ABORT.2018-05-13.dat_SKIP_AT|Failed MBR_KEY Lookup|11575
/home/Binay/bin] 82#

Ожидаемый выход

/home/Binay/bin] 82#  cat /data/xyz/serial/fep_xyz/temp/./xyz_reject_file_details_20180926194730.dat | awk -F'|' ' {print $1,$2,$3} ' | while read abort_file abort_reason record_count                        <
> do
> echo ${abort_reason}
> done
Failed MBR_KEY Lookup
Failed MBR_KEY Lookup
/home/Binay/bin] 83#

Но в настоящее время я получаю вывод как

/home/Binay/bin] 82#  cat /data/xyz/serial/fep_xyz/temp/./xyz_reject_file_details_20180926194730.dat | awk -F'|' ' {print $1,$2,$3} ' | while read abort_file abort_reason record_count                        <
> do
> echo ${abort_reason}
> done
Failed
Failed
/home/Binay/bin] 83#

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Ваше второе поле содержит пробелы.Эффект вашего первоначального сценария 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
0 голосов
/ 27 сентября 2018
while IFS='|' read -r abort_file abort_reason record_count; do echo ${abort_reason}; done < filename

Почему бы не использовать разделитель полей ввода в то время как?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...