5

我使用 awk 从两个不同的文件中提取和计算信息,并且我想将结果合并到列中的单个文件中(例如,第 1 列和第 2 列中的第一个文件的输出以及第 3 和第 4 列中的第二个文件的输出)。

输入文件包含:

文件 1

SRR513804.1218581HWI-ST695_116193610:4:1307:17513:49120 SRR513804.16872HWI ST695_116193610:4:1101:7150:72196    SRR513804.2106179HWI-
ST695_116193610:4:2206:10596:165949 SRR513804.1710546HWI-ST695_116193610:4:2107:13906:128004    SRR513804.544253

文件2

>SRR513804.1218581HWI-ST695_116193610:4:1307:17513:49120
TTTTGTTTTTTCTATATTTGAAAAAGAAATATGAAAACTTCATTTATATTTTCCACAAAG
AATGATTCAGCATCCTTCAAAGAAATTCAATATGTATAAAACGGTAATTCTAAATTTTAT
ACATATTGAATTTCTTTGAAGGATGCTGAATCATTCTTTGTGGAAAATATAAATGAAGTT
TTCATATTTCTTTTTCAAAT

要解析第一个文件,我这样做:

awk '
{
  s      = NF
  center = $1
}
{
  printf "%s\t %d\n", center, s
}
' file1

要解析第二个文件,我这样做:

awk '
/^>/ {
    if (count != "")
      printf "%s\t %d\n", seq_id, count
    count  = 0
    seq_id = $0
    next
}

NF {
  long  = length($0)
  count = count+long
}
END{
  if (count != "")
    printf "%s\t %d\n", seq_id, count
}
' file2

我的临时解决方案是在第二步中创建一个临时并覆盖。有一种更“优雅”的方式来获得这个输出?

4

1 回答 1

1

我对要求并不完全清楚,如果您可以更新问题,我们可以帮助即兴回答。但是,根据我收集到的信息,您想总结这两个文件的输出。我假设两个文件中的内容是按顺序排列的。如果不是这种情况,那么我们将不得不在打印摘要时添加额外的检查。

script.awk 的内容(重用大部分现有代码):

NR==FNR {
    s[NR]      = NF
    center[NR] = $1
    next
}

/^>/ {
    seq_id[++y] = $0
    ++i
    next
}

NF {
    long[i] += length($0)
}
END {
    for(x=1;x<=length(s);x++) {
        printf "%s\t %d\t %d\n", center[x], s[x], long[x]
    }
}

测试:

$ cat file1
SRR513804.1218581HWI-ST695_116193610:4:1307:17513:49120 SRR513804.16872HWI ST695_116193610:4:1101:7150:72196    SRR513804.2106179HWI-
ST695_116193610:4:2206:10596:165949 SRR513804.1710546HWI-ST695_116193610:4:2107:13906:128004    SRR513804.544253

$ cat file2
>SRR513804.1218581HWI-ST695_116193610:4:1307:17513:49120
TTTTGTTTTTTCTATATTTGAAAAAGAAATATGAAAACTTCATTTATATTTTCCACAAAG
AATGATTCAGCATCCTTCAAAGAAATTCAATATGTATAAAACGGTAATTCTAAATTTTAT
ACATATTGAATTTCTTTGAAGGATGCTGAATCATTCTTTGTGGAAAATATAAATGAAGTT
TTCATATTTCTTTTTCAAAT

$ awk -f script.awk file1 file2
SRR513804.1218581HWI-ST695_116193610:4:1307:17513:49120  4   200
ST695_116193610:4:2206:10596:165949  3   0
于 2013-06-16T04:38:59.150 回答