【问题标题】:how to print CSV values from bash script when values have spaces当值有空格时如何从bash脚本打印CSV值
【发布时间】:2014-07-16 09:34:22
【问题描述】:

我有以下 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

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=SIMPLE_FILES.CSV 时)得到以下内容

 /read_path_from_csv.bash


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

到目前为止还不错,

但如果我运行 bash 脚本(当我设置 CSV=COMPLEX_FILES.CSV 时)得到 follwoiojng

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

我的结论 - 似乎 PATH 中的空格会导致此错误

请告知如何更新我的代码以打印 COMPLEX_FILES.CSV 中定义的 PATH,

如何在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

【问题讨论】:

  • 我看不到 COMPLEX_FILES.csv 输入和输出之间的区别,除了第一行没有打印。你能指出来吗?
  • 第一行不打印,因为它们是参数,我们只想打印第二行中的值直到结束
  • 那为什么不直接awk 'NR&gt;1' file呢?目前还不清楚你想要什么,而且绝对使用eval 看起来有点奇怪。
  • awk 'NR>1' 仅打印值,但我需要将值设置为 CSV 第一行中定义的参数(参数应打印在 bash脚本)
  • 如果您有其他想法,请告诉我

标签: bash shell csv awk eval


【解决方案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)

说明:

如果你在bash中运行eval 'FILE1=/path/file name'会报错:

-bash: name: command not found

您可以引用/path/file name 部分以避免此错误:

> eval 'FILE1="/path/file name"'
> echo $FILE1
/path/file name

【讨论】:

  • 好的解决方案我同意(+1 和 UPVOTE)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2012-12-15
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
相关资源
最近更新 更多