比较awk中两个文件的字段

比较awk中两个文件的字段,awk,Awk,我想比较两个文件的两个字段,如下所示: 将文件1的第2个字段与文件2的第1个字段进行比较,打印匹配项(即使匹配重复)以及文件1和文件2的所有列 文件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

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

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

文件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
但有两个问题:

  • 如果在我希望打印行时重复匹配,则不会打印行
  • 它在输出中重复文件2中的第一个字段

  • 如何使这个awk命令很好地工作?提前感谢。

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

    awk 'FNR==NR{seen[$1]=$0; next} ($2 in seen) {$2=seen[$2]}7' file2 file1
    
    添加
    | column-t
    以获得更一致的列间距。

    小awk

    awk '{x[$1]=$0}$2=x[$2]' f2 f1
    
    如果$1和$2可以包含相同的值

     awk '{x[$1]=$0}FNR!=NR&&$2=x[$2]' f2 f1
    
    输出
    这对u来说应该简单明了:

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

    您是否尝试过使用
    加入
    join-12-21+1知道我不是唯一一个用右手食指(
    7
    )比用左手小指(
    1
    )更多的人:-D但是它可能是
    awk'FNR==NR{..}($2 in seen)和&$2=seen[$2]
    @Kent-Hah!这就是你这么做的原因吗?我之所以采用它,是因为我认为它使它看起来越来越不“神奇”,这(希望)会让人们问起它。我在列之间添加OFS=“\t”以获得一个标签。为了确保我理解,您将第二个文件的第一列作为“seen”数组的键,并将第二个文件的所有列作为其值,是否正确?然后检查第一个文件的第2列是否存在于“seen”数组的键中,如果存在,则打印整个文件,其中第二列为第二个文件的第二列。是这样吗?现在,7对我来说确实是一个神奇的名词?如果可能的话,请您解释一下好吗?@EtanReisner是的,我左手小指最频繁的击键是
    ESC
    ,就在我键盘上
    1
    旁边。@Kent我之所以不使用这样的模式分配,有两个原因。我已经被结果
    0
    和awk咬了几次,考虑到这是错误的,因为我认为这对不熟悉awk的人来说更容易混淆。但你是对的,在这种情况下,它肯定会安全工作。聪明。但是,如果
    f2
    的任何第二个字段与该文件中的任何前一个字段匹配,则这不起作用(我不知道该数据是否可能)。添加
    FNR==NR
    next
    修复了这个问题。如果
    f2
    中的任何一行正好是
    0
    ,它也会失败,但这似乎不太可能用于此数据。@EtanReisner我使用的是file1的$1和$2不太可能包含相同的值这一事实(从示例判断)。此外,它们的数字前面似乎有一个字符,因此0不应该是一个问题。显然,这不是一个非常通用的方法,而您的方法更适合于更广泛的问题。出于好奇,您选择
    ARGIND@EtanReisner不是特别不,只是觉得我会做得和平常不一样。无论如何,我已更新:)
    
    awk 'NR==FNR {n[$2]=$0} {if ($1 in n) print n[$1],$2,$3,$4}' file1 file2