我正在尝试将所有“空”一词替换为数组中的元素。问题在于,在替换完一个单词“ null”之后,我想用数组中的下一个元素替换下一个“ null”。
我对bash不太满意,我觉得这是一个非常基本的问题。
这是我到目前为止所拥有的:
for m in $(cat finalfile.csv)
do
if [ "$m" = "null" ]
then
m=cwearray[$counter]
let counter++
fi
done
这不会替换finalfile.csv
中的任何内容。
例如,如果文件具有:
"value1","value2","null","value3"\n
"value1","value2","null","value3"...
并且数组具有[“ foo”,“ bar”]
我希望是这样
"value1","value2","foo","value3"\n
"value1","value2","bar","value3"...
答案 0 :(得分:2)
在Perl中更容易,您可以在替换的替换部分直接增加索引:
printf '%s\n' 1,2,3,null null,2,3,4 null,null,null,null \
| perl -pe 'BEGIN { @cwe = qw( A B C D E F ) }
s/(?:^|(?<=,))null(?=,|$)/$cwe[$i++]/g'
更新:看来您已经用示例输入更新了问题。如果将双引号括起来,则将变得更加容易,因为无需检查它们是否被逗号或开头/结尾。
perl -pe 'BEGIN{ @cwe = qw( foo bar ) }
s/"null"/"$cwe[$i++]"/g'
答案 1 :(得分:2)
可以使用bash进行操作,即使每行有多个null:
$ cat finalfile.csv
"value1","value2","null","null"
"value1","value2","null","value3"
$ cwearray=( foo bar baz )
$ idx=0
$ while read -r line; do
while [[ $line == *null* ]]; do
line=${line/null/${cwearray[idx++]}}
# ...............^^^^^^^^^^^^^^^^^^
# replace the _first_ "null" with the _next_ array element
done
echo "$line"
done < finalfile.csv > updatedfinalfile.csv
$ cat updatedfinalfile.csv
"value1","value2","foo","bar"
"value1","value2","baz","value3"
答案 2 :(得分:0)
逐行读取文件。如果一行包含null
,请使用sed
将所有出现的null
替换为通过数组索引检索的相应值。
#!/bin/bash
file="finalfile.csv"
counter=0
array=(
"foo"
"bar"
)
while read -r line; do
item="${array[$counter]}"
echo "$line" | sed "s/null/$item/g"
((counter++))
done < "$file"
答案 3 :(得分:0)
awk解决方案:
declare -a cwearray
cwearray=(foo bar)
awk -F, 'NR==FNR{repl[NR]=$0; next}{for(i=1;i<=NF;i++){if($i=="\"null\""){$i="\""repl[++counter]"\""}}}1' OFS="," <(for i in "${cwearray[@]}"; do echo "$i"; done) <file>