Shell 循环中的Awk语法错误

Shell 循环中的Awk语法错误,shell,awk,Shell,Awk,用途:如果在file2$1中找到file1中的$NF,则将file1中的$NF替换为file2$2。否则,不做任何更改 我的代码: cat file1 xi=zaoshui jiao=@E0488_5@ chi=fan da qiu=@E0488_3@ gong=zuo you xi @E0977_5@ cat file2 @E0488_3@ @E21562_3@ @E0488_5@ @E21562_5@ @E0977_3@ @E21630_3@ @E0977_5@ @E21630_5@ @E

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

我的代码:

cat file1
xi=zaoshui jiao=@E0488_5@
chi=fan da qiu=@E0488_3@
gong=zuo you xi @E0977_5@

cat file2
@E0488_3@ @E21562_3@
@E0488_5@ @E21562_5@
@E0977_3@ @E21630_3@
@E0977_5@ @E21630_5@
@E0977_6@ @E21631_1@
但这是一个错误:

awk 'NR==FNR{a[$1]=$2;next}
     {split($NF,a,"=");for($NF in a){$NF=a[$NF]}}1' test2.txt test1.txt
我的代码看起来正确吗?似乎发生了语法问题。我怎样才能改进它

我的预期产出:

awk: cmd. line:1: NR==FNR{a[$1]=$2;next}{split($NF,a,"=");for($NF in a){$NF=a[$NF]}}1
awk: cmd. line:1:                                                     ^ syntax error

不完全确定,但请您尝试以下内容,并让我知道这是否有助于您

   xi=zaoshui jiao=@E21562_5@
   chi=fan da qiu=@E21562_3@
   gong=zuo you xi @E21630_5@
输出如下

awk 'FNR==NR{a[$1]=$NF;next} ($NF in a){$NF=a[$NF]} 1' FS="=" file2 FS='[= ]' OFS="=" file1
编辑:现在也为相同内容添加解释

xi=zaoshui jiao=@E0488_5@
chi=fan da qiu=@E0488_3@
gong=zuo you xi @E0977_5@
  • for($NF在a中)
    的语法无效,(
    $NF
    给出值)
可能是

awk '
FNR==NR{                               ##Checking condition FNR==NR which will be TRUE when first Input_file named file2 is being read.
  a[$1]=$NF;                           ##making an array named a whose index is $1 of current line and value is last field of the current line.
  next                                 ##next will skip all the further statements now.
}
($NF in a){                            ##Checking condition here if last field of current line of Input_file file1 is present in array a if yes then do following.
  $NF=a[$NF]                           ##creating last field value to array a value whose index is $NF of current line in Input_file file1.
}
1                                      ##1 will print the lines for Input_file file1.
' FS="=" file2 FS='[= ]' OFS="=" file1 ##Setting FS="=" for file2 and setting FS value to either = or space for file1 and setting OFS value to = for file1 too.
请阅读以下内容:

  • 使用
    sub($NF,a[$NF])
    保留原始字段分隔符,自上次记录以来,最后一个字段之前有空格,而最后一个字段之前有
    =
    的其他行,假设值在最后一个字段之外不重复
测试结果:

for (var in array)
    body

我的代码如下,希望它能有所帮助,即使它不是最有效的答案

$ cat file1
xi=zaoshui jiao=@E0488_5@
chi=fan da qiu=@E0488_3@
gong=zuo you xi @E0977_5@

$ cat file2
@E0488_3@ @E21562_3@
@E0488_5@ @E21562_5@
@E0977_3@ @E21630_3@
@E0977_5@ @E21630_5@
@E0977_6@ @E21631_1@

$ awk 'FNR==NR{a[$1]=$NF;next}($NF in a){sub($NF,a[$NF])}1' file2 FS='[ =]' file1
xi=zaoshui jiao=@E21562_5@
chi=fan da qiu=@E21562_3@
gong=zuo you xi @E21630_5@
正如您所说,如果在file2$1中找到file3的$NF,则将file1替换为file3,而不是将file3的$NF替换为file2$2

awk '$NF ~ /=/ {gsub("="," @ ",$NF)}{print $0}' file1 > file3
cat file3
xi=zaoshui jiao @ @E0488_5@
chi=fan da qiu @ @E0488_3@
gong=zuo you xi @E0977_5@

不能将
$NF
用作循环变量。我猜你想要(a中的x){$x=a[x]},但它不是很清楚。投票以打字错误结束。谢谢。很抱歉给您带来不便,我已经更新了我的question@Sundeepyou是的,我更改了
if
而不是
for
,但是输出与原始文件1相比没有任何更改,为什么awk'NR==FNR{a[$1]=$2;next}{split($NF,a,“=”);if($NF在a中){$NF=a[$NF]}}1'`是。它似乎没有改变,我已经更新了我的question@huangcheng,现在已经相应地更改了我的代码,请让我知道这是否对您有帮助。是的,它可以工作,请您清楚地说明分隔符
FS='[=]'
mean?@huangcheng,现在为我的代码添加了解释请查看一下,并让我知道这是否对您有帮助。,非常感谢你的解释~谢谢,真的很棒。但还有一个问题,当我用代码中的
FS='[=]'
更改了
FS='='
时,输出的更改与我预期的不同。所以,请您对“代码> FS=‘[=’/<代码> > @ @黄澄与<代码> FS= = [[] ] /<代码>,您是否告诉AWK,字段分隔符是空或<代码> = />代码>,我是因为您的最后一行而做出的,否则AWK将处理最后一个记录的最后字段(<代码> $NF= >左优席@ E2163055@ <代码>),如果您只设置了
FS='='
awk 'NR==FNR {a[$1]=$2;next}($NF in a){$NF=a[$NF]}1' file2 file3 | sed 's/ @ /=/g'
xi=zaoshui jiao=@E21562_5@
chi=fan da qiu=@E21562_3@
gong=zuo you xi @E21630_5@