AWK:基本逐行匹配和字段更改

时间:2018-04-30 15:32:45

标签: awk

我似乎无法弄清楚为什么这不起作用。请帮忙。我试图将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

1 个答案:

答案 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