【发布时间】: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
我的逻辑在某个地方存在严重缺陷。有人能帮我发现我的问题吗?谢谢。
【问题讨论】:
-
这里有两个问题,一个琐碎,一个严重。最简单的一点是
<<<"${file}" cut -d'/' -f4将字符串“start.csv”作为输入传递给cut,而不是通过该名称从文件中读取。严重的是(如果您修复第一个)$var将包含 all 行的版本(由换行符分隔),然后将其与sed一起使用将尝试附加所有文件中的每一行。它不会将$var的第一行应用于文件的第一行等,它会将$var的所有 行应用于文件的第一行,然后再次应用于第二行,等等。 -
@GordonDavisson 谢谢你的解释——现在我更清楚了