我似乎无法弄清楚为什么这不起作用。请帮忙。我试图将file1中$ 7的值与file2中的$ 7相匹配。当我将file1中的$ 7中的值复制到file2中的$ 3时,我可以使用它,但由于某些原因,AWK不喜欢我用7美元做的事情。 AWK只是请。
代码
awk 'BEGIN {FS=OFS="\t"}
NR == FNR { values[substr($1,0,10) FS $2] = $7; next }
(substr($5,0,10) FS $6) in values { $7 = values[substr($1,0,10) FS $2]}1' file1 file2
文件1
LANGBPRJ01.RD.LA ae31.0 25 400000.0 Default 25
文件2
RSMTDSRJ02 ae4.0 null 110 LANGBPRJ01 ae31.0 null 110
输出我看到了:
RSMTDSRJ02 ae4.0 null 110 LANGBPRJ01 ae31.0 110
所需输出
RSMTDSRJ02 ae4.0 null 110 LANGBPRJ01 ae31.0 25 110
答案 0 :(得分:2)
$7 = values[substr($1,0,10) FS $2]
应为$7 = values[substr($5,0,10) FS $6]
btw字段,字符串,数组等都是从awk中的1
开始,而不是0
,所以当您在第二个参数中写substr(string,0,...
0
时只是一个无效的值,awk会将该上下文中的任何无效值视为1
。您可以将0
替换为"aardvark"
并获得相同的结果。您应该使用substr(string,1,...
代替。
你可能根本不需要在第二个文件的$ 5上使用substr()s,因为它似乎总是10个字符。
最后 - 默认情况下使用,
作为数组索引分隔符,如果有特定需要,只需分支到FS,OFS或其他任何内容,
试试这个:
awk 'BEGIN {FS=OFS="\t"}
NR == FNR { values[substr($1,1,10),$2] = $7; next }
($5,$6) in values { $7 = values[$5,$6] } 1' file1 file2