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

Dataframe 使用条件awk语句创建具有附加值的新字段,dataframe,awk,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 40

问题 如何使用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

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

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

只需引用Bob,还需要添加第三个字段,而不是第二个字段

$ 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
第一个解决方案:请您也尝试一下以下内容。我在这里使用的是
NF
NF+1
awk
的现成变量。其中,
$NF
表示当前行的最后一列的值,
$(NF+1)
将在找到
st field string
Bob`的条件时创建一个附加列

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.

哇,那真的很简单。你介意解释一下1在行尾的作用吗?awk不会自动打印,你必须告诉它。一个不带引号的字符串被视为变量,而一个未初始化的变量被视为空字符串或数字零。@严重的,你能检查一下这个并让我知道吗?