我想对 csv 文件进行一些更改。该文件如下所示:
.csv 文件:
04.08.1994 22:47;3.3;29;;61.8;1;4.0;1.4;433;
04.08.1994 23:11;;27;93.0;60.6;2;2.0;6.5;133;
04.08.1994 23:48;3.1;;18.4;93.1;1;1.0;6.8;;
Run Code Online (Sandbox Code Playgroud)
所需的输出:
04.08.1994 22:47;33;29;12345;61.8;20;4.0;1.4;433;
04.08.1994 23:11;12345;27;930;60.6;40;2.0;6.5;133;
04.08.1994 23:48;31;12345;184;93.1;20;1.0;6.8;12345;
Run Code Online (Sandbox Code Playgroud)
应该发生以下情况:
用特殊值替换空字段,例如“12345”。
仅对非空字段执行某些列的算术运算(乘以 10 或 20)。
我的解决方案:
cat file | awk 'BEGIN {FS=OFS=";"} { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 12345 }; \
{ $2!=12345 && ($2=$2*10); $4!=12345 && ($4=$4*10); $6!=12345 && ($6=$6*20); print}'
Run Code Online (Sandbox Code Playgroud)
到目前为止它的工作。想知道我是否必须在每个列操作之前编写这个 if 条件?或者有更简单的方法吗?也许应该在每个字段的循环中执行所有操作?
您能否尝试以下操作(用 GNU 测试和编写awk)。
awk '
BEGIN{
FS=OFS=";"
}
{
found=""
delete a
for(i=1;i<NF;i++){
if($i==""){
a[i]
$i="12345"
found=1
}
}
}
found{
$2=2 in a?"12345":$2*10
$4=4 in a?"12345":$4*10
$6=6 in a?"12345":$6*20
}
1
' Input_file
Run Code Online (Sandbox Code Playgroud)
输出如下。
04.08.1994 22:47;33;29;12345;61.8;20;4.0;1.4;433;
04.08.1994 23:11;12345;27;930;60.6;40;2.0;6.5;133;
04.08.1994 23:48;31;12345;184;93.1;20;1.0;6.8;12345;
Run Code Online (Sandbox Code Playgroud)