2017-12-13 15 views
0
cat file1 
xizaoshuijiao @[email protected] 
chifandaqiu @[email protected] 
gongzuoyouxi @[email protected] 

cat file2 

@[email protected] @[email protected] 
@[email protected] @[email protected] 
@[email protected] @[email protected] 
@[email protected] @[email protected] 
@[email protected] @[email protected] 

目的:file1の$ NFがfile2 $ 1に見つかった場合、file1の$ NFをfile2 $に置き換えます。それ以外は変更されません。awk-IF ...コマンドのELSE IFの問題

マイコード:

awk '\ 
NR==FNR{a[$1]=$1;b[$2]=$2;next}\ 
{if($NF in a)\ 
    {$NF=b[FNR];print $0}\ 
else if!($NF in a)\ 
    {print $0}\ 
}' file2 file1 

そして、それはエラーが来た:

awk: cmd. line:5: else if!($NF in a)\ 
awk: cmd. line:5:  ^syntax error 
awk: cmd. line:6:  {print $0}\ 
awk: cmd. line:6: ^syntax error 

だからようです "!"問題。 file1のすべての内容を印刷したいので(変更された行と変更されていない行の両方)、どうすればいいですか?

答えて

3

あなたFILE2が$ 1と$ 2と同じ値を有しているので、それは役に立たないと思われる。この形で

awk 'NR==FNR {a[$1]=$2; next} 
    $NF in a {$2=a[$1]}1' file2 file1 

それを書き換えることができます。

無条件で印刷したいので、条件ブロックで印刷しないでください。ここ1{print $0}

-1

ここで確認の後に私のコードが来ます。

awk '\ 
NR==FNR{a[$1]=$1;b[$2]=$2;next}\ 
{if($NF in a)\ 
    {$NF=b[FNR];print $0}\ 
else   # use else... it will work, no need else if... , but why ? How can I achieve it with else if !($NF in a) 
    {print $0}\ 
}' file2 file1 
+1

あなたが あなたの質問の一番下にはなく、答えとして* *編集中のセクションを、これを追加する場合それは明確な/より簡潔であるかもしれないと同じである{print}に対応しています。 –

+1

それを入手してください。あなたの教えてくれてありがとう –

2

置換:

if!($NF in a) 

をして:

if(!($NF in a)) 

!試験条件およびAWKの一部は、すべての括弧内に挿入するテスト条件を想定しています。

+0

別の括弧を追加する必要があります。そうでなければ、 '(!$ NF)in a'を意味します。 – karakfa

+0

ありがとう。回答が更新されました。そして、別に、私はあなたが良い&完全な答えをまとめていることがわかります。 – John1024