我在使用此代码时遇到了一些麻烦,我不知道为什么不这样做,也许你们中的一位大师可以帮我一把。
首先,我有两个这样的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.csv
和asset
在waiver
中找到匹配的行。然后只需将目标附加到该行。
这是我到目前为止所尝试的内容:
#!/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命令外,一切似乎都在工作。有什么建议吗?
答案 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
选项。