问题 我将如何使用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
答案 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)
第一解决方案: :请您再尝试一次。我在这里使用NF
和NF+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.