我有 2 个文件,一个只有一行常量和 3 个空字段,需要插入变量以创建一个完整的唯一文件的文件。
例子:
常量.csv:
1,,3,4,,6,7,,9,10
变量.csv:
a,b,c
d,e,f
g,h,我
结果.csv:
1,a,3,4,b,6,7,c,9,10
1,d,3,4,e,6,7,f,9,10
1,g,3,4,h,6,7,i,9,10
只需使用 bash:
template=$(< Constants.csv)
template=${template//,,/,%s,}
while IFS=, read -ra values; do
printf "$template\n" "${values[@]}"
done < Variables.csv > Outcome.csv
cat Outcome.csv
1,a,3,4,b,6,7,c,9,10
1,d,3,4,e,6,7,f,9,10
1,g,3,4,h,6,7,i,9,10
你可以像这样创建一个awk程序:
#!/usr/bin/awk -f
BEGIN {
OFS = FS = ","
}
NF == 10 {
constants = $0
}
NF == 3 {
a = $1
b = $2
c = $3
$0 = constants
$2 = a
$5 = b
$8 = c
print
}
你这样称呼:
awk -f ./outcome.awk constants.csv variables.csv > outcome.csv
这假设格式与您上面的完全一样。更动态的方法是:
#!/usr/bin/awk -f
BEGIN {
OFS = FS = ","
}
constants && NF {
split($0, vars)
last_used_var = 0
$0 = constants
for (f = 1; f < NF; ++f) {
if ($f == "") {
$f = vars[++last_used_var]
}
}
print
}
constants == "" {
constants = $0
}
您可以相当快地编写一个 perl 脚本,该脚本在逗号处拆分并在找到空格的位置插入。您还可以为常量保留一个数组索引,并使用模运算来跟踪要使用的变量。