Awk 查找匹配的字段,并将两列替换为两个文件中的匹配行

Awk 查找匹配的字段,并将两列替换为两个文件中的匹配行,awk,Awk,我有两份档案。文件1中的行数大于文件2。下面是这些文件的一个小表示。我想比较两个文件的第1列,如果它们匹配,我想打印文件1中的行;将File1的第10列和第11列替换为File2 尝试以下命令时,其打印行也不匹配 awk 'BEGIN{FS=OFS="\t"} NR==FNR {s[$1]=$10; q[$1]=$11; next} $1 in s { $10=s[$1]; $11=q[$1]}1' File2 File1 文件1 文件2 预期产量 1_223022/4194397/c 4

我有两份档案。文件1中的行数大于文件2。下面是这些文件的一个小表示。我想比较两个文件的第1列,如果它们匹配,我想打印文件1中的行;将File1的第10列和第11列替换为File2

尝试以下命令时,其打印行也不匹配

awk 'BEGIN{FS=OFS="\t"} NR==FNR {s[$1]=$10; q[$1]=$11; next} $1 in s { $10=s[$1]; $11=q[$1]}1' File2 File1
文件1

文件2

预期产量

1_223022/4194397/c  4   *   0   255 *   *   0   0   vtg 235 np:i:79 rs:B:i,79,0,0,0,80,0    sn:B:f,7.14491,13.3994,7.52773,12.8957  za:f:0  zs:B:f,0
1_223022/4194398/c  4   *   0   255 *   *   0   0   aat 999 np:i:92 rs:B:i,94,0,0,0,0,0 sn:B:f,6.0494,11.9021,5.88262,10.3733   za:f:0  zs:B:f,0

查看命令的末尾:

}1
1
将始终计算为true,这使awk打印每一行

相反,它应该是:

 ... $1 in s { $10=s[$1]; $11=q[$1];print}

提醒:

awk
程序由一系列

CONDITION { Block of actions } [; CONDITION { Block of actions } ; ... ]
如果条件或动作块是可选的:如果条件缺失,awk将始终执行动作块;如果动作块缺失,如果条件评估为真,awk将使用
打印
作为默认动作

1

是一个永远真实的状态,没有任何动作。这意味着awk将打印该行。

查看命令末尾:

}1
1
将始终计算为true,这使awk打印每一行

相反,它应该是:

 ... $1 in s { $10=s[$1]; $11=q[$1];print}

提醒:

awk
程序由一系列

CONDITION { Block of actions } [; CONDITION { Block of actions } ; ... ]
如果条件或动作块是可选的:如果条件缺失,awk将始终执行动作块;如果动作块缺失,如果条件评估为真,awk将使用
打印
作为默认动作

1

是一个永远真实的状态,没有任何动作。这意味着awk将打印该行。

请尝试以下操作

awk 'FNR==NR{a[$1]=$10;b[$1]=$11;next} ($1 in a){$10=a[$1];$11=b[$1];print}'  file2  file1

添加
BEGIN{FS=OFS=“\t”}
,以防您的输入文件以制表符分隔,并且您也需要以制表符分隔的形式输出。

请尝试以下内容

awk 'FNR==NR{a[$1]=$10;b[$1]=$11;next} ($1 in a){$10=a[$1];$11=b[$1];print}'  file2  file1
添加
BEGIN{FS=OFS=“\t”}
以防您的输入文件以制表符分隔,并且您也需要以制表符分隔的形式输出