2017-04-17 177 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/