2017-04-17 176 views
0

我有一个包含10列和大量行的文件。我想添加修正修正到第10列,其行包含'G01'模式。如何使用awk和grep组合

例如,下面

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的行的第十列中的文件中应予以纠正。 我已经使用'awk'和'while'循环来做到这一点,但是对于大量文件来说需要很长时间。 如果有人能提供更有效的帮助,我们将不胜感激。

+0

'的awk '/ G01/{$ 10 = NEW_VALUE} 1' file'会做你想要什么 – hek2mgl

+0

你永远需要的grep,当你使用awk,因为awk可以做grep可以做的任何有用的事情,并且没有理由使用'while'循环(awk内部或外部)来做你想做的事情。 –

+0

如果您希望添加的*“更正”*为100,您可以使用'awk'/ G01/{$ 10 + = 100} 1'yourFile' –

回答

2

您可以使用以下方法:

awk '$2 == "G01" {$10="value"}1' file.txt 

要保留的空格,您可以使用从this post解决方案:

awk '$2 == "G01" { 
    data=1 
    n=split($0,a," ",b) 
    a[10]="value" 
    line=b[0] 
    for (i=1;i<=n; i++){ 
     line=(line a[i] b[i]) 
    } 
    print line 
}{ 
    if (data!=1){ 
     print; 
    } 
    else { 
     data=0; 
    } 
}' file.txt 
+0

非常感谢您的帮助。 –

+0

它运作良好,但在加上修正后,第10列的结果小于原来的小数位。如果有办法保持小数位的固定,那将是非常好的。 –

+0

查看我更新的答案,您可以使用[this](http://stackoverflow.com/a/20836890/2614364) –

0

与G01行的第10列应予以纠正

语法如下,它将搜索正则表达式给出Ñ内当前记录/线/行中/../无论哪个字段的正则表达式被发现

要么

$ awk '/regex/{ $10 = "somevalue"; print }' infile 

OR

1末确实默认操作print $0,即打印当前记录/行/列

$ awk '/regex/{ $10 = "somevalue" }1' infile 

OR

$0意味着当前记录/行/列

$ awk '$0 ~ /regex/{ $10 = "somevalue"}1' infile 

因此,在目前情况下,这将是下列任何

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

$ awk '/G01/{$10 = "somevalue" }1' infile 

$ awk '$0 ~ /G01/{$10 = "somevalue"; print }' infile 

$ awk '$0 ~ /G01/{$10 = "somevalue" }1' infile 

的。如果你想严格您在搜索特定字段/列记录/线/行然后

$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. 

有关其他语法说明:

由戴尔Dougherty和阿诺德罗宾斯
(O'Reilly出版)

“UNIX文本处理,” 由戴尔Dougherty和的Tim O'Reilly(海登 图书)

“的sed & AWK”

“GAWK:Effective awk Programming”,作者:Arnold D.罗宾斯
(O'Reilly出版)

http://www.gnu.org/software/gawk/manual/