【问题标题】:Read input from a csv and append that values to variable using shell script从 csv 读取输入并使用 shell 脚本将该值附加到变量
【发布时间】:2021-05-26 14:39:32
【问题描述】:
#!/bin/bash

Dir="" 
while read line
    do echo "Record is :$line"
    Dir+="Dir,$line" 
done < dir.csv 

echo $Dir

其中dir.csv 是此处的输入文件,其中包含以下数据:

/example/people/
/book/
/book/english/

我想将行的值附加到一个变量中,例如 /example/people/,/book/,/book/english/

有没有什么简单的方法可以通过 shell 脚本来实现呢?上面的脚本只显示最后一个值 ex:/book/english/

【问题讨论】:

  • 请编辑包含和格式化您的脚本的帖子,以便更好地理解它并给您一个有用的答案。
  • tr '\n' ',' &lt; dir.csv怎么样
  • 保持您当前的代码结构,您有Dir+="Dir,$line",但您应该使用Dir="$Dir,$line"Dir="$Dir${Dir:+,}$line",其中更复杂的版本避免使用前导逗号。这适用于从 Bourne shell 派生的任何 shell(shbashzshdashksh,...)。在 Bash(可能还有其他一些现代 shell)中,您可以使用 Dir+="${Dir:+,}$line",其中 ${Dir:+,} 部分仅在 Dir 设置且非空时添加逗号 - 再次避免使用前导逗号。见Shell parameter expansion

标签: bash shell unix sh


【解决方案1】:

我在您的代码中没有看到任何会导致您的脚本只显示最后一个值的内容。

这可能是一种错觉:你的dir.csv文件是CRLF-delimited吗? (DOS/Windows 格式)如果是这样,请使用dos2unix 之类的实用程序或tr -d '\r' 之类的命令删除每行结尾的CR。

一些注意事项:

  • Dir+="Dir,$line" 中,可能应该删除字符串Dir (Dir+=",$line")。
  • 您可能希望去掉最初的逗号:Dir=${Dir#,}
  • 所有这些都可以通过以下单个命令来简化:
Dir=$(paste -s -d, dir.csv)

... 或者,带有 CRLF 行尾:

Dir=$(tr -d '\r' < dir.csv | paste -s -d,)

【讨论】:

    【解决方案2】:

    这更容易:

    xargs < dir.csv|sed 's/ /,/g'
    

    或者如果您有 CRLF 行尾,您可以使用以下命令清理它们:

    xargs < dir.csv|tr -d '\r'|sed 's/ /,/g'
    

    上述提议的tr '\n' ',' &lt; dir.csv如果CSV以换行符结尾,可以在末尾添加一个额外的,

    【讨论】:

    • 我想保存变量中的所有值(例如 /example/people/,/book/,/book/english/),但这也只显示最后一行(,/book/english /)
    • 请检查您的行尾,或查看我更新的答案。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2014-03-29
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多