我有这样的文件:
AA,A=14,B=356,C=845,D=4516 BB,A=65,C=255,D=841,E=5133,F=1428 CC,A=88,B=54,C=549,F=225
我永远不知道在行中是否缺少A,B,C或D值.但我需要将此文件转换为:
AA,D=4516,-,- BB,F=225
因此,如果缺少任何值打印 – 标记.我的计划具有相同数量的列以便于解析.我更喜欢awk解决方案.感谢您的任何建议或帮助.
我的第一次尝试是:
awk '{gsub(/[,]/,"\t")}; BEGIN{ FS = OFS = "\t" } { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = "-" }; {print $0}'
但后来我注意到,缺少一些价值观.
编辑:
从我的标题我知道有值A,C,D,E,F ……
$cat file.txt AA,F=225 $perl -F,-le '@k=(A..F); $op[0]=$F[0]; @op[1..6]=("-")x6; $j=0; for($i=1;$i<=$#F;){ if($F[$i] =~ m/$k[$j++]=/){$op[$j]=$F[$i]; $i++} } print join(",",@op) ' file.txt AA,F=225
> -F,打开输入线,并保存到@F数组> -l从输入行中删除换行符,为输出添加换行符> @ k =(A..F);用A,B等初始化@k数组到F> $op [0] = $F [0]; @op [1..6] =( “ – ”)5233;使用@F的第一个元素初始化@op数组,剩余的六个元素为 – > for循环遍历@F数组,如果元素与相应索引中的@k数组元素匹配,后跟=,则更改@op元素> print join(“,”,@ op)打印@op数组,作为分隔符