我试图使用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)
如何读取第一个文件并存储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,2到Flag...{$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)