【问题标题】:Joining files awk加入文件 awk
【发布时间】:2014-01-16 20:13:58
【问题描述】:

我有两个文件:

FILE A
12  999900  1
12  999901  1
12  999902  1
12  999903  1
12  999904  1
12  999905  1
12  999906  1
12  999907  1
12  999908  2
12  999909  2
12  999910  2
12  999911  2
12  999912  2

FILE B

#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  Carolyn
12  1000010 .   G   A   221 .   DP=9;VDB=0.0298;AF1=1;AC1=2;DP4=0,0,4,5;MQ=60;FQ=-54    GT:PL:DP:GQ 1/1:254,27,0:9:51
12  1000482 .   G   A   117 .   DP=7;VDB=0.0398;AF1=1;AC1=2;DP4=0,0,1,4;MQ=60;FQ=-42    GT:PL:DP:GQ 1/1:150,15,0:5:27
12  1001152 .   T   C   127 .   DP=10;VDB=0.0392;AF1=1;AC1=2;DP4=0,0,4,6;MQ=58;FQ=-57   GT:PL:DP:GQ

我想编写一个 AWK 脚本,比较文件 A 中的 $2 和文件 B 中的 $2。输出应该与文件 A 类似,但有另一列。如果文件 A 和 B 中的 $2 匹配,则第 4 列应显示“匹配!”。

注意:文件 A 的行数比文件 B 多。

这可能吗??

【问题讨论】:

  • 每个文件的第二列是否已排序?
  • 是的。但是加入命令不起作用...它会引发错误
  • 它抛出:"join: depth_Carolyn.txt:101: is not sorted: 12 1000000 11" 但它已排序.....

标签: join awk


【解决方案1】:

使用awk

cat f1
12  999900  1
12  999901  1
12  999902  1
12  999903  1
12  999904  1
12  999905  1
12  999906  1
12  999907  1
12  999908  2
12  999909  2
12  999910  2
12  999911  2
12  999912  2

cat f2
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  Carolyn
12  1000010 .   G   A   221 .   DP=9;VDB=0.0298;AF1=1;AC1=2;DP4=0,0,4,5;MQ=60;FQ=-54    GT:PL:DP:GQ 1/1:254,27,0:9:51
12   999909 .   G   A   117 .   DP=7;VDB=0.0398;AF1=1;AC1=2;DP4=0,0,1,4;MQ=60;FQ=-42    GT:PL:DP:GQ 1/1:150,15,0:5:27
12  1001152 .   T   C   127 .   DP=10;VDB=0.0392;AF1=1;AC1=2;DP4=0,0,4,6;MQ=58;FQ=-57   GT:PL:DP:GQ

awk 'FNR==NR {a[$2];next} $2 in a {$0=$0 " match!"} 1' f2 f1
12  999900  1
12  999901  1
12  999902  1
12  999903  1
12  999904  1
12  999905  1
12  999906  1
12  999907  1
12  999908  2
12  999909  2 match!
12  999910  2
12  999911  2
12  999912  2

它是如何工作的

awk '
    FNR==NR {               # Run this section for f2 file
        a[$2]               # store record #2 in array a
        next}               # skip to next record
    $2 in a {               # if $2 in file f1 is found in array a
        $0=$0 " match!"     # change record to show the match
        }
    1                       # do the default action, print $0
    ' f2 f1                 # the two input files

【讨论】:

  • 你能解释一下吗?这种方式我理解而不是复制和粘贴。
  • 这个非常基本的awk array,所以你应该在这里和其他地方找到很多关于它是如何工作的例子。更新了我的帖子。
  • 我同意@BMW 的观点,即++ 似乎没有任何作用。 AWK 中的数组基本上就像 Python 中的 dict,您只是依赖于字段 2 中值的唯一性。
  • 如果真的很挑剔,连()都可以去掉。所以可以是:awk 'FNR==NR {a[$2];next} $2 in a {$0=$0 " match!"} 1' f2 f1
  • 更新帖子,删除 ++ 和括号。
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 2013-06-24
  • 2015-10-16
  • 2017-07-20
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多