使用bash sed写入CSV不能按预期工作

时间:2014-02-11 00:16:20

标签: bash csv sed

我在使用此代码时遇到了一些麻烦,我不知道为什么不这样做,也许你们中的一位大师可以帮我一把。

首先,我有两个这样的CSV文件:

Book1.csv:

Desc,asset,asset name,something,waiver,waiver name,init date,wrong date,blah,blah,target
akdhfa,2014,adskf,kadsfjh,123-4567,none,none,none,none,none,BOOP

Book2.csv

Desc,asset,asset name,something,waiver,waiver name,init date,wrong date,blah,blah,target
akdhfa,2014,adskf,kadsfjh,123-4567,none,none,none,none,none

(第二本书缺乏“BOOP”)

我想要的是扫描Book1.csv第11列。如果有,请根据Book2.csvassetwaiver中找到匹配的行。然后只需将目标附加到该行。

这是我到目前为止所尝试的内容:

#!/bin/bash
oldIFS=IFS
IFS=$'\n'
HOME=($(cat Book1.csv))
for i in "${HOME[@]}"
do
    target=`echo $i | cut -d "," -f 11`
    asset=`echo $i | cut -d "," -f 2`
    waiv=`echo $i | cut -d "," -f 5`
    if [ "$target" != "target" ]
    then
        sed -i '/*${asset}*${waiv}*/s/$/,${target}/' Book2.csv
        fi
done
IFS=oldIFS

除了sed命令外,一切似乎都在工作。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您正在使用

sed -i '/*${asset}*${waiv}*/s/$/,${target}/' Book2.csv

表示变量未展开('引号“隐藏”它们)。

同样*需要“在它前面” - 可能你打算使用.*(否则你正在寻找“asset中最后一个字符的任意数量的重复等等。)。

只需将其更改为

即可
sed -i "/.*${asset}.*${waiv}.*/s/$/,${target}/" Book2.csv

现在变量将在sed命令运行之前替换为它们的值,而量词(*)应该正常工作,因为它有量化(.)。 ..

答案 1 :(得分:0)

你正在使用单引号,这会抑制变量扩展。更改为双引号。

这个awk可能更整洁:

awk -F, -v OFS=, '
    NR == FNR {boop[$2,$5] = $11; next}
    NF != 11  {$11 = boop[$2,$5]}
    {print}
' Book1.csv Book2.csv > tmpfile && mv tmpfile Book2.csv

awk没有-i选项。