【问题标题】:Feed CSV file into variable in Bash for parsing将 CSV 文件输入到 Bash 中的变量中进行解析
【发布时间】:2020-09-30 10:48:00
【问题描述】:

对于 CSV 文件中的每一行,我想提取一个字段并使用 Bash 在行中重新定位它。该行是一个 URL,我使用 / 作为分隔符。

这是起始文件(start.csv):

https://docs.website.com/12-3/articles/guide-1/article-1.html
https://docs.website.com/12-2/articles/guide-2/article-5.html
https://docs.website.com/12-1/articles/guide-3/article-6.html

供以后参考,网址为https://{url}/{version}/irrelevant/{guide}/irrelevant.html

想要的输出是(end.csv):

url,name,tag,version,guide,views
https://docs.website.com/12-3/articles/guide-1/article-1.html,,,12-3,guide-1,0
https://docs.website.com/12-2/articles/guide-2/article-5.html,,,12-2,guide-2,0
https://docs.website.com/12-1/articles/guide-3/article-6.html,,,12-1,guide-3,0

我尝试了多种变体,但均未成功:

file="start.csv"
var="$(<<<"${file}" cut -d'/' -f4)"

sed -e "s|$|,$var,,,,0|g" < start.csv > end.csv

然而,这成功地生成了一个带有版本的列:

cut -d'/' -f4 < start.csv

我的逻辑在某个地方存在严重缺陷。有人能帮我发现我的问题吗?谢谢。

【问题讨论】:

  • 这里有两个问题,一个琐碎,一个严重。最简单的一点是&lt;&lt;&lt;"${file}" cut -d'/' -f4 将字符串“start.csv”作为输入传递给cut,而不是通过该名称从文件中读取。严重的是(如果您修复第一个)$var 将包含 all 行的版本(由换行符分隔),然后将其与 sed 一起使用将尝试附加所有文件中的每一行。它不会将$var 的第一行应用于文件的第一行等,它会将$var所有 行应用于文件的第一行,然后再次应用于第二行,等等。
  • @GordonDavisson 谢谢你的解释——现在我更清楚了

标签: bash csv scripting


【解决方案1】:

更简单,使用awk:

awk -F/ -v OFS=, '{print $0, "", "", $4, $6, 0}' file

https://docs.website.com/12-3/articles/guide-1/article-1.html,,,12-3,guide-1,0
https://docs.website.com/12-2/articles/guide-2/article-5.html,,,12-2,guide-2,0
https://docs.website.com/12-1/articles/guide-3/article-6.html,,,12-1,guide-3,0

【讨论】:

  • 比我想弄清楚的要好得多。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-04-28
  • 2013-02-27
  • 2012-08-23
  • 2013-04-09
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
相关资源
最近更新 更多