我有以下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文件并打印FILE1,FILE2,FILE3的文件PATH
备注-我仅以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中的空格导致了此错误
请提供有关如何更新我的代码的建议,以打印COMPLEX_FILES.CSV中定义的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
是的,它是导致此问题的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句