#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