如何使用awk和grep组合

如何使用awk和grep组合,awk,Awk,我有一个有10列和很多行的文件。我想在第10列中添加一个修正,该列的行包含“G01”模式 例如,在下面的文件中 AS G17 2014 3 31 0 2 0.000000 1 -0.809159910000E-04 AS G12 2014 3 31 0 2 0.000000 1 0.195515363000E-03 AS G15 2014 3 31 0 2 0.0000

我有一个有10列和很多行的文件。我想在第10列中添加一个修正,该列的行包含“G01”模式

例如,在下面的文件中

AS G17  2014  3 31  0  2  0.000000  1   -0.809159910000E-04                     
AS G12  2014  3 31  0  2  0.000000  1    0.195515363000E-03                     
AS G15  2014  3 31  0  2  0.000000  1   -0.171167837000E-03                     
AS G29  2014  3 31  0  2  0.000000  1    0.521982134000E-03                     
AS G07  2014  3 31  0  2  0.000000  1    0.329889640000E-03                     
AS G05  2014  3 31  0  2  0.000000  1   -0.381588767000E-03                     
AS G25  2014  3 31  0  2  0.000000  1    0.203352860000E-04                     
AS G01  2014  3 31  0  2  0.000000  1    0.650180300000E-05                     
AS G24  2014  3 31  0  2  0.000000  1   -0.258444780000E-04                     
AS G27  2014  3 31  0  2  0.000000  1   -0.203691700000E-04   
应更正G01行的第10列。 我使用了“awk”和“while”循环来实现这一点,但是对于海量文件来说,这需要很长时间。
如果有人能提供更有效的帮助,我们将不胜感激

您可以使用以下选项:

awk '$2 == "G01" {$10="value"}1' file.txt
要保留空白,您可以使用以下解决方案:

awk'$2==“G01”{
数据=1
n=拆分($0,a,“,b)
a[10]=“值”
行=b[0]

对于(i=1;i,您可以使用以下内容:

awk '$2 == "G01" {$10="value"}1' file.txt
要保留空白,您可以使用以下解决方案:

awk'$2==“G01”{
数据=1
n=拆分($0,a,“,b)
a[10]=“值”
行=b[0]
对于(i=1;i
应更正G01行的第10列

语法如下所示,它将搜索当前记录/行/行中
/../
中给定的正则表达式,而不管找到的是哪个字段

任何一个 或
1
最后执行默认操作
print$0
,即打印当前记录/行/行

$ awk '/regex/{ $10 = "somevalue" }1' infile
$ awk '$0 ~ /regex/{ $10 = "somevalue"}1' infile
$0
表示当前记录/行/行

$ awk '/regex/{ $10 = "somevalue" }1' infile
$ awk '$0 ~ /regex/{ $10 = "somevalue"}1' infile
因此,在当前环境下,它将是以下任何一种 如果您希望严格搜索记录/行/行中的特定字段/列,则
$10
表示第10个字段/列

$ awk '$2 == "G01" {$10 = "somevalue"; print }' infile

$ awk '$2 == "G01" {$10 = "somevalue" }1' infile
如果您想将shell变量中的某个单词传递给awk,或者只传递一个单词,那么

$ awk -v search="G01" -v replace="foo" '$2 == search {$10 = replace }1' infile
然后从壳牌公司得到同样的产品

$ search_value="G01"
$ new_value="foo"
$ awk -v search="$search_value" -v replace="$new_value" '$2 == search {$10 = replace }1' infile
来自人类

-v var=val

   --assign var=val

    Assign  the  value  val to the variable var, before execution of
    the program begins.  Such variable values are available  to  the
    BEGIN block of an AWK program.
有关其他语法说明: 戴尔·多尔蒂和阿诺德·罗宾斯的《sed&awk》
(奥雷利)

“UNIX文本处理”,由Dale Dougherty和Tim O'Reilly(Hayden)撰写 书籍)

阿诺德·D·罗宾斯的《呆呆呆的:有效的awk编程》
(奥雷利)

应更正G01行的第10列

语法如下所示,它将搜索当前记录/行/行中
/../
中给定的正则表达式,而不管找到的是哪个字段

任何一个 或
1
最后执行默认操作
print$0
,即打印当前记录/行/行

$ awk '/regex/{ $10 = "somevalue" }1' infile
$ awk '$0 ~ /regex/{ $10 = "somevalue"}1' infile
$0
表示当前记录/行/行

$ awk '/regex/{ $10 = "somevalue" }1' infile
$ awk '$0 ~ /regex/{ $10 = "somevalue"}1' infile
因此,在当前环境下,它将是以下任何一种 如果您希望严格搜索记录/行/行中的特定字段/列,则
$10
表示第10个字段/列

$ awk '$2 == "G01" {$10 = "somevalue"; print }' infile

$ awk '$2 == "G01" {$10 = "somevalue" }1' infile
如果您想将shell变量中的某个单词传递给awk,或者只传递一个单词,那么

$ awk -v search="G01" -v replace="foo" '$2 == search {$10 = replace }1' infile
然后从壳牌公司得到同样的产品

$ search_value="G01"
$ new_value="foo"
$ awk -v search="$search_value" -v replace="$new_value" '$2 == search {$10 = replace }1' infile
来自人类

-v var=val

   --assign var=val

    Assign  the  value  val to the variable var, before execution of
    the program begins.  Such variable values are available  to  the
    BEGIN block of an AWK program.
有关其他语法说明: 戴尔·多尔蒂和阿诺德·罗宾斯的《sed&awk》
(奥雷利)

“UNIX文本处理”,由Dale Dougherty和Tim O'Reilly(Hayden)撰写 书籍)

阿诺德·D·罗宾斯的《呆呆呆的:有效的awk编程》
(奥雷利)


awk'/G01/{$10=NEW_VALUE}1'文件
将做你想做的事情当你使用awk时你永远不需要grep,因为awk可以做grep可以做的任何有用的事情,而
while
循环(在awk内部或外部)来做你想做的事情是没有理由的。如果你想添加的“更正”是100,你可以使用
awk'/G01/{$10+=100}1'您的文件
谢谢您的回答。它可以工作,但在减少最终结果的小数位数方面存在一些问题。您有没有提前设置小数位数的想法?
awk'/G01/{$10=NEW_VALUE}1'文件
将做你想做的事情当你使用awk时你永远不需要grep,因为awk可以做任何grep可以做的有用的事情,并且没有理由在
循环时(在awk内部或外部)做你想做的事情。如果你想添加的“更正”是100,你可以使用
awk'/G01/{$10+=100}1'yourFile
谢谢您的回答。它可以工作,但在减少最终结果的小数位数方面存在一些问题。您对事先设置小数位数有什么想法吗?非常感谢您的帮助。它工作得很好,但添加更正后,结果第10列的小数位数比原始列减少了。I如果有办法保持小数位不变,那就太好了。看到我更新的答案,你可以使用它,非常感谢你的帮助。它工作得很好,但在添加了更正后,结果第10列的小数位比原来的小数位减少了。如果有办法保持小数位不变,那就太好了更新答案,您可以使用