代码之家  ›  专栏  ›  技术社区  ›  bapors

比较不同文件的多列,如果存在匹配项,则从文件中追加一列

  •  2
  • bapors  · 技术社区  · 7 年前

    我在访问awk中文件的列时遇到问题。 我有两个文件,一个有12列,另一个有5列。

    1.txt
    chr1 10 20 . . + chr1 30 40 ABC . +
    chr2 11 22 . . + chr2 90 92 XXX . -
    chrX 33 42 . . + chrX 70 80 XXX . +
    chr4 3  12 . . + chr4 70 80 ZZZ . +
    

    2.txt
    1 chr1 30 40 ABC
    3 chr1 35 40 ABC
    27 chr2 90 92 XXX
    1 chrX 70 80 XXX
    2 chrY 12 13 XXX
    

    我想比较 2.txt 第7、8、9、10页 1.txt. 如果有匹配项,则应打印 1.txt ,以及 2.txt.

    预期输出:

    chr1 10 20 . . + chr1 30 40 ABC . + 1
    chr2 11 22 . . + chr2 90 92 XXX . - 27
    chrX 33 42 . . + chrX 70 80 XXX . + 1
    

    因为我无法比较这4列,所以我选择了两列。并且,我能够比较每一列的两个列(第2列和第3列) 2.txt 第7和第8页 1.txt ),如果有匹配项,我可以打印一个字符串。但我无法打印第一个文件的第一列。 我的代码:

    awk -F, 'NR==FNR {a[$2 FS $3];next} {print $0 FS (($7 FS $8) in a?"exists":"none")}' 2.txt 1.txt
    

    它是什么(我不想要):

    chr1 10 20 . . + chr1 30 40 ABC . + exists
    chr2 11 22 . . + chr2 90 92 XXX . - exists
    chrX 33 42 . . + chrX 70 80 XXX . + exists
    chr4 3  12 . . + chr4 70 80 ZZZ . + none
    

    如何将新的第13列更改为对应的第1列 1.txt?

    2 回复  |  直到 7 年前
        1
  •  2
  •   RomanPerekhrest    7 年前

    方法:

    awk 'NR==FNR{ a[$2,$3,$4,$5]=$1; next }
         { s=SUBSEP; k=$7 s $8 s $9 s $10 }k in a{ print $0,a[k] }' 2.txt 1.txt
    

    输出:

    chr1 10 20 . . + chr1 30 40 ABC . + 1
    chr2 11 22 . . + chr2 90 92 XXX . - 27
    chrX 33 42 . . + chrX 70 80 XXX . + 1
    
        2
  •  0
  •   RavinderSingh13 Nikita Bakshi    7 年前

    下列的 awk 可能在同样的方面对你有所帮助。

    awk 'FNR==NR{a[$2,$3,$4,$5]=$0;next} {printf("%s%s\n",$0,(($7,$8,$9,$10) in a)?" exists":" none")}' 2.txt 1.txt
    

    输出如下。

    chr1 10 20 . . + chr1 30 40 ABC . + exists
    chr2 11 22 . . + chr2 90 92 XXX . - exists
    chrX 33 42 . . + chrX 70 80 XXX . + exists
    chr4 3  12 . . + chr4 70 80 ZZZ . + none
    

    同样在这里添加解释。

    awk '
    FNR==NR{  ##Mentioning FNR==NR condition which will be TRUE only when first Input_file named 2.txt is being read.
      a[$2,$3,$4,$5]=$0; ##creating an array named a whose indexes are 2nd 3rd 4th and 5th field and value is current line value.
      next               ##next is awk default keyword which will skip all further statements.
    }
    {
      printf("%s%s\n",$0,(($7,$8,$9,$10) in a)?" exists":" none") ##Printing current line and a conditional statement result here, if $7,$8,$9,$10 are present in array a then print string exists in last of line or print none.
    }' 2.txt 1.txt                                                ##Mentioning the Input_file names here.