如何使用awk命令中的条件语句和循环语句将具有特殊值的文件转换为"Error“之类的不同值,而不执行任何减法,而只是将转换后的新值显示为"Error”作为输出?
-F,‘{打印$1,$2,($3-2),($4-2),($5-2),($6-$2),($7-2),($8-2),($8-2),($9-2),($10-2),($11-2),($12-2),($13-2),($14-1)}’all.cvs
基本上我想:x表示列2到14的列值。
如果$2 (列2)= 11111,则为
如果列值为$2= 11111,则将
如果列值=11111,则$x=$x-$2
在$x=Error
的新值。
我有一个文件(all.cvs),如下所示:
F 225分隔。
$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
....发布于 2012-04-16 15:31:28
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
}
'发布于 2012-04-16 08:23:53
您可以使用以下方法:
$ 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发布于 2012-04-16 07:05:02
将条件块放在默认块之前。将next放在每一行的末尾,以便用下一行继续处理。
https://stackoverflow.com/questions/10169849
复制相似问题