比较awk中两个文件的字段

时间:2014-10-29 13:04:59

标签: awk

我想比较两个文件的两个字段,如下所示:

将文件一的第二个字段与文件二的第一个字段进行比较,打印匹配(即使重复匹配)以及文件一和二的所有列。

文件1:

 G4   b45  3  4
 G4   b45  1  3
 G3   b23  2  2
 G3   b22  2  6
 G3   b22  2  4

文件2:

 b45  a  b  c
 b64  d  e  f  
 b23  g  h  i
 b22  j  k  l
 b20  m  n  o     

输出:

 G4   b45  a  b  c  3  4
 G4   b45  a  b  c  1  3
 G3   b23  g  h  i  2  2
 G3   b22  j  k  l  2  6
 G3   b22  j  k  l  2  4

我使用关联数组使用以下awk命令尝试了这个:

awk 'FNR==NR {array1[$2] = $1 ; arrayrest[$2] = substr($0, index($0, $2)); next}($1 in array1) {print array1[$1] "\t" $0 "\t" arrayrest[$1]}' file1 file2

但有两个问题:

  1. 如果在我希望打印时重复匹配,则不打印行。
  2. 它在输出中重复文件二的第一个字段。
  3. 我怎样才能使这个awk命令工作得很好?提前谢谢。

3 个答案:

答案 0 :(得分:2)

不是您想要的确切输出格式,而是正确的输出内容。

awk 'FNR==NR{seen[$1]=$0; next} ($2 in seen) {$2=seen[$2]}7' file2 file1

添加| column -t以获得更一致的列间距。

答案 1 :(得分:1)

这对你来说应该简单明了:

awk 'NR==FNR {n[$2]=$0} {if ($1 in n) print n[$1],$2,$3,$4}' file1 file2

答案 2 :(得分:0)

小awk

awk '{x[$1]=$0}$2=x[$2]' f2 f1

如果$ 1和$ 2可以包含相同的值

 awk '{x[$1]=$0}FNR!=NR&&$2=x[$2]' f2 f1

输出

G4  b45  a  b  c 3 4
G4  b45  a  b  c 1 3
G3  b23  g  h  i 2 2
G3  b22  j  k  l 2 6
G3  b22  j  k  l 2 4