Awk 查找匹配的字段,并将两列替换为两个文件中的匹配行
我有两份档案。文件1中的行数大于文件2。下面是这些文件的一个小表示。我想比较两个文件的第1列,如果它们匹配,我想打印文件1中的行;将File1的第10列和第11列替换为File2 尝试以下命令时,其打印行也不匹配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
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”}
以防您的输入文件以制表符分隔,并且您也需要以制表符分隔的形式输出