我有两个文件。 File1中的行数大于File2。波纹管是文件的一个小表示。我想比较两个文件的column1,如果它们匹配,我想从File1打印该行;将File1的column10和column11替换为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
File1
1_223022/4194397/c 4 * 0 255 * * 0 0 zvt 443 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 tty 221 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
411_223022/4194426/v 4 * 0 255 * * 0 0 gvy 721 np:i:17 rs:B:i,19,0,0,0,1,0 sn:B:f,7.48538,14.1506,7.67945,13.5199 za:f:0 zs:B:f,0
File2
1_223022/4194397/c 4 * 0 0 * * 0 0 vtg 235 MT
1_223022/4194398/c 4 * 0 0 * * 0 0 aat 999 SO
预期产量
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
答案 0 :(得分:3)
查看命令结尾:
}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将使用print
作为默认动作条件是否为真。
1
是一个始终为真的条件,没有任何操作。这意味着awk将打印该行。
答案 1 :(得分:2)
请您尝试以下。
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"}
,以防输入文件用制表符分隔,并且您也需要以制表符分隔格式输出。