Dav*_*ave 2 scripting text-processing join
我有两个文件。file_1.txt 看起来像这样:
R1 C1 C2 C3 C4 C5
R2 C1 C2 C3 C4 C5
R3 C1 C2 C3 C4 C5
R4 C1 C2 C3 C4 C5
R5 C1 C2 C3 C4 C5
R6 C1 C2 C3 C4 C5
R7 C1 C2 C3 C4 C5
R8 C1 C2 C3 C4 C5
R9 C1 C2 C3 C4 C5
R10 C1 C2 C3 C4 C5
Run Code Online (Sandbox Code Playgroud)
file_2.txt 看起来像这样:
R4 C4 C5
R6 C4 C5
R7 C4 C5
R9 C4 C5
Run Code Online (Sandbox Code Playgroud)
我想将 file_1.txt 中的 C4 和 C5 值替换为 file_2.txt 中与它们对应的值,同时保持 file_1.txt 中的 C1、C2 和 C3 值不变。
因此生成的 file_3.txt 应如下所示:
R1 C1 C2 C3 C4 C5
R2 C1 C2 C3 C4 C5
R3 C1 C2 C3 C4 C5
R4 C1 C2 C3 C4_new C5_new
R5 C1 C2 C3 C4 C5
R6 C1 C2 C3 C4_new C5_new
R7 C1 C2 C3 C4_new C5_new
R8 C1 C2 C3 C4 C5
R9 C1 C2 C3 C4_new C5_new
R10 C1 C2 C3 C4 C5
Run Code Online (Sandbox Code Playgroud)
所有值都是数字。file_1.txt 和 file_2.txt 中的第一列是关键字段,按数字升序排列。
这是单独加入可以做的事情吗?
这个问题使得awk的一个典型应用
awk 'NR == FNR{a1[$1]=$2; a2[$1]=$3; next};
$1 in a1{$5=a1[$1]; $6=a2[$1]};{print}' file_2.txt file_1.txt
Run Code Online (Sandbox Code Playgroud)
您可能必须将输出字段分隔符显式设置为制表符,在这种情况下
awk -v OFS='\t' 'NR == FNR{a1[$1]=$2; a2[$1]=$3; next};
$1 in a1{$5=a1[$1]; $6=a2[$1]};{print}' file_2.txt file_1.txt
Run Code Online (Sandbox Code Playgroud)