在同一个文件上进行多次替换 - awk

Ped*_*roA 0 perl awk replace

我试图使用awk单线程脚本在同一个文件上进行多次替换.用于变量赋值的文件如下:

> cat names 
1 Dusky
2 Flag
3 Mon
Run Code Online (Sandbox Code Playgroud)

我想在这个文件中做替换:

> cat file.txt 
  1        1   0.6248 0.3752 
  2        2   0.0430 0.9570 
  3        3   0.0624 0.9376
Run Code Online (Sandbox Code Playgroud)

我试过的是:

while read num name; do 
    awk -v J=$num -v R=$name '{if (match($1, J)) $2=R; print;}' file.txt; 
done < names
Run Code Online (Sandbox Code Playgroud)

但是此代码打印了要替换的每一行的输入文件.

1 Dusky 0.6248 0.3752
  2        2   0.0430 0.9570 
  3        3   0.0624 0.9376 
  1        1   0.6248 0.3752 
2 Flag 0.0430 0.9570
  3        3   0.0624 0.9376 
  1        1   0.6248 0.3752 
  2        2   0.0430 0.9570 
3 Mon 0.0624 0.9376
Run Code Online (Sandbox Code Playgroud)

如何让它只打印一次更换的线?可以是awk或perl.

期望的输出:

1 Dusky 0.6248 0.3752
2 Flag 0.0430 0.9570
3 Mon 0.0624 0.9376
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 6

如何读取第一个文件并存储ID?然后,使用匹配的名称/ id替换第二个文件中的第二个字段.

awk 'FNR==NR {a[$1]=$2; next} {$2=a[$2]; print}' names f
Run Code Online (Sandbox Code Playgroud)

对于您的给定输入,它返回:

1 Dusky 0.6248 0.3752
2 Flag 0.0430 0.9570
3 Mon 0.0624 0.9376
Run Code Online (Sandbox Code Playgroud)

说明

  • FNR==NR {a[$1]=$2; next}读取第一个文件时,将第二个字段存储在索引为第1个字段的数组中.这样一来,1被映射到Dusky,2Flag...
  • {$2=a[$2]; print}在读取第二个文件时,将第二个字段替换为第一个文件中的相应ID.然后,打印.这可以用更具惯用性的方式编写{$2=a[$2]}1.

请注意,您可以添加安全检查:只需替换第二个文件中的第二个字段(如果它确实存在):

awk 'FNR==NR {a[$1]=$2; next} {if ($2 in a) $2=a[$2]} 1' names f
Run Code Online (Sandbox Code Playgroud)

  • 您甚至可以简化操作,在第二个动作块之后使用“ 1”,而不是“ print”。 (2认同)