首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux shell awk:满足条件时显示不同的列值

Linux shell awk:满足条件时显示不同的列值
EN

Stack Overflow用户
提问于 2012-04-16 06:57:54
回答 3查看 1K关注 0票数 1

如何使用awk命令中的条件语句和循环语句将具有特殊值的文件转换为"Error“之类的不同值,而不执行任何减法,而只是将转换后的新值显示为"Error”作为输出?

  1. 如果列值(除了在最终输出中保持不变的第1列)都不等于"11111“这样的特殊值,则使用awk命令,如下所示:

-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

  • ‘,如果列值=特殊值,则不必做"-$2",只需显示一个新值,如"Error"

基本上我想:x表示列2到14的列值。

如果$2 (列2)= 11111,则为

如果列值为$2= 11111,则将

  • 设置为$3到$14 (列#3至#14)

如果列值=11111,则$x=$x-$2

在$x=Error

  • 的末尾,输出仍将显示14列,包括原始的#1列值和转换/计算的第2列到#14

的新值。

我有一个文件(all.cvs),如下所示:

  • 14字段
  • 每行可能包含一个值为"11111“(或任何字符串值)的字段,每个列由”、“、”
  • “总行数为90

F 225分隔。

代码语言:javascript
复制
$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 
....
EN

回答 3

Stack Overflow用户

发布于 2012-04-16 15:31:28

代码语言:javascript
复制
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
  }
'
票数 3
EN

Stack Overflow用户

发布于 2012-04-16 08:23:53

您可以使用以下方法:

代码语言:javascript
复制
$ 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
票数 1
EN

Stack Overflow用户

发布于 2012-04-16 07:05:02

将条件块放在默认块之前。将next放在每一行的末尾,以便用下一行继续处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10169849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档