查找匹配的字段并交换两列以匹配两个文件中的行

时间:2019-05-11 08:40:55

标签: awk

我有两个文件。 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

2 个答案:

答案 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"},以防输入文件用制表符分隔,并且您也需要以制表符分隔格式输出。