代码之家  ›  专栏  ›  技术社区  ›  maihabunash

当值有空格时,如何从bash脚本打印CSV值

  •  1
  • maihabunash  · 技术社区  · 11 年前

    我有以下内容 CSV格式 文件(我有linux红帽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 文件1、文件2、文件3

    remark-我设置了参数 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=简单文件.CSV )获取以下信息

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

    直到现在,

    但是如果我运行bash脚本(当我设置 CSV=复合文件.CSV )获得以下信息

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

    我的结论-PATH中的空格似乎导致了这个错误

    请建议如何更新我的代码,以便按照 复合文件.CSV ,

    如何添加一个 " 在PATH和一之前 " 在PATH之后?

    示例I 应该 得到:

    /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
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   WKPlus    11 年前

    是的,是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