如何在awk命令中使用条件语句和循环语句将具有特殊值的文件转换为不同的值,如“Error”,而不进行任何减法,而只是将转换后的新值显示为“Error”as输出?
如果列值(除了在最终输出中保持相同的第1列除外)等于特殊值(如“11111”),我使用如下的awk命令:
awk -F, '{print $1,$2,($3-$2),($4-$2),($5-$2),($6-$2),($7-$2),($8-$2),($9-$2),($10-$2),($11-$2),($12-$2),($13-$2),($14-$1)} ' all.cvs
如果列值=特殊值,则无需执行“ - $ 2”,只显示“错误”之类的新值
基本上我想要:x表示第2列到第14列的列值
如果$ 2(第2列)= 11111
set $2="Error"
$ 3至$ 14(第3列至第14列) 11111
$x=$x-$2
如果列值= 11111
$x=Error
最后,输出仍会显示14列,包括原始#1列值和第2列到第14列的转换/计算新值
我有一个文件(all.cvs),如下所示:
14个字段
每行可能包含一个值为“11111”(或任何字符串值)的字段
每列用“,”
总行数为90
$cat all.cvs
A,11111,2,3,4,5,6,7,8,9,10,11,12,13
B,1,2,3,4,5,6,11111,8,9,10,11,12,13
C,1,2,3,4,5,6,7,8,9,11111,11,12,13
....
答案 0 :(得分:3)
awk -F, -v OFS=, -v flag_value=11111 '
{subtract = $2}
$2 == flag_value {$2 = "Error"; subtract = 0}
{
for (i=3; i<=NF; i++) $i = ($i == flag_value ? "Error" : $i - subtract)
print
}
'
答案 1 :(得分:1)
您可以使用以下方法:
$ awk -F, '
{
printf("%s", $1);
s=($2 != 11111 ? $2 : 0);
printf(", %s", ($2 != 11111 ? $2 : "Error"));
for (i=3; i<=NF; ++i)
printf (", %d", ($i != 11111 ? ($i - s) : "Error"));
printf("\n");
}' all.csv
答案 2 :(得分:0)
将条件块放在默认块之前。将next
放在每个末尾,以便继续处理下一行。