как да отпечатате 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, освен факта, че първият ред не се отпечатва. Бихте ли посочили така?   -  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 и ГЛАСУВАНЕ ЗА) - person maihabunash; 16.07.2014