有条件的awk语句以创建具有附加值的新字段

时间:2019-02-22 17:58:04

标签: dataframe awk

问题 我将如何使用awk创建具有$ 2 +一致值的新字段? 我打算循环浏览一个值列表,但是我不介意为每个命令使用一个衬里

伪代码

awk '$1 == Bob {$4 = $2 + 400}' file

样本数据

Philip  13  2
Bob  152   8
Bob  4561  2
Bob  234  36
Bob  98  12
Rey  147  152
Rey  15   1547

预期产量

Philip  13  2
Bob  152   8  408
Bob  4561  2  402
Bob  234  36  436
Bob  98  12   412
Rey  147  152
Rey  15   1547

3 个答案:

答案 0 :(得分:3)

只引用鲍勃,你也想添加第三字段而不是第二

$ awk '$1=="Bob" {$4=$3+400}1' file | column -t

Philip  13    2
Bob     152   8     408
Bob     4561  2     402
Bob     234   36    436
Bob     98    12    412
Rey     147   152
Rey     15    1547

答案 1 :(得分:2)

在这里,检查$1是否等于Bob并通过将$0附加到$2 FS 400来重建记录($0)。这里的FS是在第三和第四字段之间使用的字段分隔符。最后的1表示告诉awk采取默认操作print。

awk '$1=="Bob"{$0=$0 FS $2 + 400}1' file
Philip  13  2
Bob  152   8 552
Bob  4561  2 4961
Bob  234  36 634
Bob  98  12 498
Rey  147  152
Rey  15   1547

或者,如果您想将name(Bob)保留为变量

awk -vname="Bob" '$1==name{$0=$0 FS $2 + 400}1' file

答案 2 :(得分:2)

第一解决方案: :请您再尝试一次。我在这里使用NFNF+1 awk的现成变量。其中$NF表示当前行最后一列的值,如果发现$(NF+1) Bob`的条件为TRUE,st field string将创建一个附加列。

awk '{$(NF+1)=$1=="Bob"?400+$NF:""} 1' OFS="\t" Input_file

第二个解决方案: :如果我们不想创建新字段,而只是想按条件打印值,然后尝试以下操作,则应该更多我相信更快。

awk 'BEGIN{OFS="\t"}{$1=$1;print $0,$1=="Bob"?400+$NF:""}' Input_file

输出如下。

Philip  13      2   
Bob     152     8      408
Bob     4561    2      402
Bob     234     36     436
Bob     98      12     412
Rey     147     152 
Rey     15      1547

说明: 现在添加上述代码的说明。

awk '                                 ##Starting awk program here.
{
  $(NF+1)=$1=="Bob"?400+$NF:""        ##Creating a new last field here whose value will be depending upon condition check.
                                      ##its checking condition if 1st field is having Bob string in it then add 400 value to last field value or make it NULL.
}
1                                     ##awk works on method of condition then action. so by mentioning 1 making condition TRUE here and NO action defined so by default print of current line will happen.
' OFS="\t"  Input_file                ##Setting OFS as TAB here where OFS ois output field separator and mentioning Input_file name here.