对于我的脚本,我必须从文件中读取数据。
例如,我有 2 个文件:一个是文本文件,第二个是 10 列的 csv 文件。
我想做的是读取 csv 并更改第一个文件中的参数。
- 用于
sed -n
一次读取一行数据并将其保存在fileC
- 使用
sed "s/&replacefile1param/&readFileC/g"
我遇到的问题是在第二步中读取cat
of作为参数。readFileC
我怎样才能做到这一点?
第一个文件是一个示例脚本文件,内部有 2 个参数。第二个文件是一个 CSV 文件,有 200 行 6 列。
我需要通过读取 CSV 中的列并替换参数来更改模板文件。结果需要为 200 个 file1,并且每个结果也需要保存在 CSV 第 4 列中指定的位置。
示例模板文件
The name =scriptname
The staments go here
job name = jobname
exit
示例 CSV 数据
scriptname,jobname,date,location,updated,env
kkkkkk,filetest,2001-01-01,/san00/project,test
kkkkk2,filetest2,2001-01-01,/san00/project,test
kkkkk3,filetest3,2001-01-01,/san00/project2,real
我需要将模板文件中的参数替换为从 CSV 中获取的值,并将文件保存到/san00
CSV 第 4 列的位置。
所需输出
The script name kkkkkk
The staments go here
job name = filetest
exit
这应该保存在san00/project
.
答案1
file1
是模板和file2
csv。如果两行具有相同的位置,会发生什么,未定义,下面的解决方案将使用最新数据覆盖位置文件。我也不清楚该/san00
目录是否是位置部分中唯一使用的目录以及它是否应该是绝对路径。
解决方案创建相对于当前目录的位置(注意.
in.$dir
和.$location
)。
while IFS=, read scriptname jobname date location updated env; do
dir=$(dirname $location)
[ -d .$dir ] || mkdir -p ".$dir"
sed -e "s/scriptname/$scriptname/" \
-e "s/jobname/$jobname/" file1 > ".$location"
done < <(tail -n +2 file2)
位置中使用绝对路径的解决方案,目标目录必须预先存在
while IFS=, read scriptname jobname date location updated env; do
sed -e "s/scriptname/$scriptname/" \
-e "s/jobname/$jobname/" file1 > "$location"
done < <(tail -n +2 file2)
提取 的信息的方法有很多种file2
,上述只是其中一种,根据数据的性质,它可能比这更复杂。
答案2
这可能对你有用:
sed '1d;s|\([^,]*\),\([^,]*\),[^,]*,\([^,]*\).*|sed "1s/scriptname/\1/;5s/jobname/\2/" template >\3|' file.csv |
sh