2017-09-01 8 views
2

FileAとFileBの2つのファイルがあります。 FileAが変更されます。 FileBには新しい値が含まれています。 FileBには3つのフィールドがあります。最初の2つのフィールドは、FileAの最初の2つのフィールドと比較されます。フィールドが一致する場合は、Field3を変更する必要があります。以下のコードはこのように動作しています: "2つの値が一致する場合は、フィールド3を変更して行を印刷します。一致するものがなければ、次に"私が望むふるまいは、「一致がなければ、行をそのまま印刷します」。コードの "else"部分は機能しません。私は非常に多くのバリエーションを試しました。AWK一致する場合は新しい値でフィールドを印刷し、それ以外の場合は印刷行

awk -F'\t' -v OFS='\t' ' 
# first, read in data from file B 
NR == FNR { values[$1 FS $2] = $3; next } 

# then, output modified lines from matching lines in file A 
($1 FS $2) in values { $3 = values[$1 FS $2]; print } else { print $0 } 
' fileB fileA 

FILEA

PROVDSRJ02.RD.RI ae0.0 16  
PROVDSRJ02.RD.RI ae1.1 1000  
PROVDSRJ02.RD.RI ae2.0 5000  
PROVDSRJ02.RD.RI ae3.0 5000  
ASHBBBRJ01.RD.AS ae39.0 16  
ASHBBPRJ01.RD.AS ae2.0 16  
ASHBBPRJ02.RD.AS ae1.0 16  
ASHBBPRJ02.RD.AS ae2.0 16  
ASHBBBRJ01.RD.AS ae0.0 16  
ASHBBBRJ01.RD.AS ae11.0 16 

FILEB

ASHBBBRJ01.RD.AS ae10.0 524 
ASHBBBRJ01.RD.AS ae11.0 235 
ASHBBBRJ01.RD.AS ae39.0 2096 
ASHBBBRJ01.RD.AS ae6.0 183 
ASHBBBRJ01.RD.AS ae7.0 1141 
ASHBBBRJ02.RD.AS ae11.0 88 
ASHBBBRJ02.RD.AS ae13.0 333 
ASHBBBRJ02.RD.AS ae20.0 374 
ASHBBBRJ02.RD.AS ae9.0 1885 

所望の出力(**ラインを変え示し、コードに含まれるべきではありません)

PROVDSRJ02.RD.RI ae0.0 16  
PROVDSRJ02.RD.RI ae1.1 1000  
PROVDSRJ02.RD.RI ae2.0 5000  
PROVDSRJ02.RD.RI ae3.0 5000  
**ASHBBBRJ01.RD.AS ae39.0 2096**  
ASHBBPRJ01.RD.AS ae2.0 16  
ASHBBPRJ02.RD.AS ae1.0 16  
ASHBBPRJ02.RD.AS ae2.0 16  
ASHBBBRJ01.RD.AS ae0.0 16  
**ASHBBBRJ01.RD.AS ae11.0 235** 
+0

期待される出力とともに 'FileA'と' FileB'のサンプルを投稿してください。ありがとう。 –

+1

[MCVE](https://stackoverflow.com/help/mcve)を読み、それに従うか、無視される危険性があります。 – Thor

+0

重複していません。誰かがその最後の投稿にコメントし、新しい投稿を作成すると言っています...私はちょうど私が話されたことをやっています... – user3746195

答えて

2

あなたの構文がオフになっています。一部の学習リソースについてはtag infoを確認してください。

いずれにしても、elseは不要です。新しい値に条件付きで$3を設定して(すでに行っているように)、その行を常に印刷します(変更されているかどうかは不明です)。

ここでは、ショートカット1を使用して、常に行を印刷します。 1は、現在の行を印刷するデフォルトアクションを呼び出す常に真のパターンです。それが今や意味をなさないならば、それは間もなくなります。

$ awk 'BEGIN {FS=OFS="\t"} 
     NR == FNR {values[$1 FS $2] = $3; next} 
     ($1 FS $2) in values {$3 = values[$1 FS $2]}1' fileB fileA 
PROVDSRJ02.RD.RI ae0.0 16 
PROVDSRJ02.RD.RI ae1.1 1000 
PROVDSRJ02.RD.RI ae2.0 5000 
PROVDSRJ02.RD.RI ae3.0 5000 
ASHBBBRJ01.RD.AS ae39.0 2096 
ASHBBPRJ01.RD.AS ae2.0 16 
ASHBBPRJ02.RD.AS ae1.0 16 
ASHBBPRJ02.RD.AS ae2.0 16 
ASHBBBRJ01.RD.AS ae0.0 16 
ASHBBBRJ01.RD.AS ae11.0 235 
+0

'{idx = $ 1 FS $ 2} 3つの場所で '$ 1 FS $ 2'をハードコーディングするのではなく、どこでも' idx'を使用してください。 –

関連する問題