Проблема с анализом csv-файла с помощью скрипта bash

#bash #shell

#удар #ракушка

Вопрос:

Я хочу проанализировать следующий csv-файл:

 $ cat file.csv  11:16:16:31:67:01,123456789a123456789b123456789c123456789d123456789e 11:16:16:31:67:02,123456789a123456789b123456789c123456789d123456789e 11:16:16:31:66:FF,123456789a123456789b123456789c123456789d123456789e 11:16:16:31:67:00,123456789a123456789b123456789c123456789d123456789e  

Вот мой код:

 $ cat read.sh  #! /bin/sh OLDIFS=$IFS IFS=',' while read f1 f2; do  echo "$f1, $f2" done lt; file.csv IFS=$OLDIFS  

Похоже, работают колодцы:

 $ ./read.sh  11:16:16:31:67:01, 123456789a123456789b123456789c123456789d123456789e 11:16:16:31:67:02, 123456789a123456789b123456789c123456789d123456789e 11:16:16:31:66:FF, 123456789a123456789b123456789c123456789d123456789e 11:16:16:31:67:00, 123456789a123456789b123456789c123456789d123456789e  

Но если я изменю порядок вывода:

От

 while read f1 f2; do  echo "$f1, $f2" # lt;= change order done lt; file.csv  

Для

 while read f1 f2; do  echo "$f2, $f1" done lt; file.csv  

Тогда вывод не является моим ожидаемым форматом. Я не знаю, почему? Может кто-нибудь дать мне совет? Спасибо.

 $ ./read.sh  , 11:16:16:31:67:01b123456789c123456789d123456789e , 11:16:16:31:67:02b123456789c123456789d123456789e , 11:16:16:31:66:FFb123456789c123456789d123456789e , 11:16:16:31:67:00b123456789c123456789d123456789e  

Комментарии:

1. Используйте awk для лучшей обработки csv файлов, если не рассматриваете анализатор csv на perl, python, php. У вашего ввода могут быть окончания строк DOS, т. е. r

Ответ №1:

После удаления CR он хорошо работает:

вот мой тест:

 $ file file.csv  file.csv: ASCII text, with CRLF line terminators  $ dos2unix file.csv  dos2unix: converting file file.csv to Unix format...  $ file file.csv  file.csv: ASCII text  

и это хорошо работает:

 $ ./read.sh  123456789a123456789b123456789c123456789d123456789e, 11:16:16:31:67:01 123456789a123456789b123456789c123456789d123456789e, 11:16:16:31:67:02 123456789a123456789b123456789c123456789d123456789e, 11:16:16:31:66:FF 123456789a123456789b123456789c123456789d123456789e, 11:16:16:31:67:00