2017-04-17 23 views
0

私は10列とたくさんの行を持つファイルを持っています。私はその行に 'G01'パターンが含まれている第10列に修正修正を加えたいと思います。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とラインの10番目の列を修正する必要があります。 私は 'while'ループで 'awk'を使っていましたが、大量のファイルには非常に時間がかかります。 誰かがより効果的な方法で助けることができれば分かるでしょう。

+0

'のawk '/ G01/{$ 10 = NEW_VALUE} 1' file'はあなたがしているときは、決してgrepのを必要としない – hek2mgl

+0

やりたいだろうawkはgrepが行うことができる有用な何かを行うことができるのでawkを使用しています。あなたが望むことを行うためのawkの内側または外側のwhileループは必要ありません。 –

+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番目の列は

を補正する必要があります

構文は次のとおりです。これは正規表現を検索しますnは正規表現を

が見出されたにかかわらず、そのフィールドの現在のレコード/行/列における/../いずれ

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

OR

1内側端におけるデフォルト動作print $0を行い、それは/印刷現在のレコードであります行/列

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

OR

$0あなたが特定のフィールド/列に厳密に検索したい場合ので、現在のコンテキストで、それは次のよう

$ 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 

のいずれかになります
$ awk '$0 ~ /regex/{ $10 = "somevalue"}1' infile 

現在のレコード/行/列を意味し、レコード/行/列次いで

$10 10フィールド/カラムを

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

$ awk '$2 == "G01" {$10 = "somevalue" }1' infile 
手段ここで3210

あなたは男

からシェル

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

からawkのか、単に単語、その後

$ awk -v search="G01" -v replace="foo" '$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. 

構文の詳細については、

"UNIXのテキスト処理、" デールDougherty氏とティム・オライリー(ヘイデン ブックス)によって

デールDougherty氏とアーノルドロビンス
(オライリー)によって "&のawkをsedの"

"GAWK:Effective awk Programming"、Arnold D.ロビンス
(オライリー)

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

関連する問題