как печатать значения CSV из сценария bash, когда значения имеют пробелы

У меня есть следующие файлы CSV (у меня версия linux red-hat 6.2)

# more  SIMPLE_FILES.CSV
  FILE1,FILE2,FILE3
  /etc/hosts,/etc/info.txt,/var/log.txt
  /etc/some_file,/var/collect.txt,/etc/INFO.txt
  /sbin/ls,/sbin/awk,/sbin/sed

 # more COMPLEX_FILES.CSV
   FILE1,FILE2,FILE3
   /etc/config/net ip.txt,/var/log/summary snap/LOG OF global/info.txt
   /etc/hosts files hosts.info/etc/hosts,var/log/messages,/sbin/collect file/all.info
   /etc/old/TEXT INFO/info.txt/etc/OLD FILES/info.txt,/root/customor select/info.txt

следующий скрипт bash должен прочитать файл CSV и распечатать PATH файлов для FILE1,FILE2,FILE3

примечание - я устанавливаю параметр CSV_LINE=2 только для примера (вторые значения в CSV)

 #!/bin/bash


 CSV=SIMPLE_FILES.CSV

 CSV_LINE=2

 eval $(awk -v A=$CSV_LINE -F, 'NR==1 { for (i=1; i<=NF; i++) sn[i]=$i }
            NR==A { for (i=1; i<=NF; i++) print sn[i] "=" $i; exit }' $CSV  )


 echo $FILE1
 echo $FILE2
 echo $FILE3

поэтому, если я запускаю скрипт bash (когда я устанавливаю CSV=SIMPLE_FILES.CSV), получаю следующее

 /read_path_from_csv.bash


 /etc/hosts
 /etc/info.txt
 /var/log.txt

пока все нормально,

но если я запускаю сценарий bash (когда я устанавливаю CSV=COMPLEX_FILES.CSV), я получаю следующее

  ./read_path_from_csv.bash: line 20: ip.txt: command not found

Мой вывод - кажется, что пробелы в PATH вызывают эту ошибку

пожалуйста, посоветуйте, как обновить мой код, чтобы напечатать PATH, как определено в COMPLEX_FILES.CSV,

Как добавить один " перед PATH и один " после PATH?

Пример того, что я должен получить:

/read_path_from_csv.bash

/etc/config/net ip.txt,/var/log/summary snap/LOG OF global/info.txt
/etc/hosts files hosts.info/etc/hosts,var/log/messages,/sbin/collect file/all.info
/etc/old/TEXT INFO/info.txt/etc/OLD FILES/info.txt,/root/customor select/info.txt

person maihabunash    schedule 16.07.2014    source источник
comment
Я не вижу разницы между вводом и выводом COMPLEX_FILES.csv, кроме того факта, что 1-я строка не печатается. Не могли бы вы указать так?   -  person fedorqui 'SO stop harming'    schedule 16.07.2014
comment
первая строка не должна печататься, потому что это параметры, мы хотим напечатать только значения из второй строки до конца   -  person maihabunash    schedule 16.07.2014
comment
Тогда почему бы не просто awk 'NR>1' file? До сих пор не ясно, чего вы хотите, и определенно использование eval выглядит немного странно.   -  person fedorqui 'SO stop harming'    schedule 16.07.2014
comment
awk 'NR>1' печатает только значения, но мне нужно установить значения в параметры, которые определены в первой строке в CSV (параметры должны быть напечатаны внутри скрипта bash)   -  person maihabunash    schedule 16.07.2014
comment
Дайте мне знать, если у вас есть другая идея   -  person maihabunash    schedule 16.07.2014
comment
Теперь все в порядке. Что я рекомендую, так это попытаться найти лучший способ объяснить это, потому что это было не очень ясно. По крайней мере мне! Однако приятно читать, что вы смогли решить эту проблему.   -  person fedorqui 'SO stop harming'    schedule 16.07.2014
comment
да, спасибо, если вы согласны, я буду рад получить один UPVOTE - :)   -  person maihabunash    schedule 16.07.2014


Ответы (1)


Да, это пробелы в PATH, которые вызывают эту проблему, и вы можете добавить кавычки, чтобы избежать этого.

eval $(awk -v A=$CSV_LINE -v q='"' -F, 'NR==1 { for (i=1; i<=NF; i++) sn[i]=$i }
            NR==A { for (i=1; i<=NF; i++) print sn[i] "=" q $i q; exit }' $CSV)

Пояснение:

Если вы запустите eval 'FILE1=/path/file name' в bash, он выдаст ошибку:

-bash: name: command not found

И вы можете заключить часть /path/file name в кавычки, чтобы избежать этой ошибки:

> eval 'FILE1="/path/file name"'
> echo $FILE1
/path/file name
person WKPlus    schedule 16.07.2014
comment
ДА ХОРОШЕЕ РЕШЕНИЕ Я СОГЛАСЕН (+1 и UPVOTE) - person maihabunash; 16.07.2014