awk-IF ...如果在命令中发出错误

时间:2017-12-13 02:25:51

标签: shell if-statement awk

cat file1
xizaoshuijiao @E0488_5@
chifandaqiu @E0488_3@
gongzuoyouxi @E0977_5@

cat file2

@E0488_3@ @E0488_3@
@E0488_5@ @E0488_5@
@E0977_3@ @E0977_3@
@E0977_5@ @E0977_5@
@E0977_6@ @E0977_6@

目的:如果在file2 $ 1中找到file1中的$ NF,则将file1中的$ NF替换为file2 $ 2.thewise,不做任何更改。

我的代码:

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 个答案:

答案 0 :(得分:3)

你可以用这种形式重写它

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

因为你的file2具有相同的$ 1和$ 2的值,所以它似乎毫无用处。

由于您想无条件打印,请不要在条件块中打印。此处1对应{print},与{print $0}

相同

答案 1 :(得分:2)

替换:

if!($NF in a)

使用:

if(!($NF in a))

!是测试条件的一部分,awk期望测试条件全部都在parens内。

答案 2 :(得分:0)

验证后我的代码出现了。

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