【问题标题】:count the total number of residues in a text file计算文本文件中的残基总数
【发布时间】:2013-11-12 08:16:26
【问题描述】:

我有一些如下所示的文本文件。我需要计算每个文件中的残基总数。第 6 列代表残基数。

file1.txt

ATOM     19  CA  LYS C 323       2.648  17.703  45.442  1.00 17.46           C 
ATOM     20  C   LYS C 323       1.884  18.118  46.688  1.00 17.13           C 
ATOM     21  O   LYS C 323       0.822  17.576  46.996  1.00 17.54           O 
ATOM     28  CA  ARG C 324       1.835  19.574  48.632  1.00 16.33           C  
ATOM     29  C   ARG C 324       1.990  21.084  48.733  1.00 16.43           C      
ATOM     45  N   LYS C 326       2.321  24.344  50.724  1.00 16.55           N  
ATOM     46  CA  LYS C 326       2.843  24.570  52.063  1.00 15.26           C
ATOM     62  N   ASP C 328       1.791  25.643  56.502  1.00 22.19           N
ATOM     63  CA  ASP C 328       2.336  25.657  57.860  1.00 23.53           C  

file2.txt

ATOM     12  CG  GLN B 670      52.075  84.009  47.855  1.00 97.39           C  
ATOM     13  CD  GLN B 670      51.068  83.904  46.726  1.00 98.36           C  
ATOM     14  OE1 GLN B 670      51.239  84.504  45.665  1.00100.00           O
ATOM     16  N   SER B 671      49.664  86.399  49.090  1.00 88.49           N  
ATOM     17  CA  SER B 671      48.384  87.100  49.166  1.00 79.72           C 

期望的输出

Total no:of residues in file1.txt : 4   
Total no:of residues in file2.txt : 2

【问题讨论】:

    标签: awk


    【解决方案1】:

    使用这个 awk 单行代码:

    awk '{a[$6]} END{print "Total no:of residues in", FILENAME, ":", length(a)}' file
    

    替代的非 gnu awk 解决方案:

    awk '{a[$6]} END{for (i in a) s++;print "Total no:of residues in", FILENAME, ":",s}' file
    

    【讨论】:

    • 一种获取数组中元素数量的好方法,我会如何使用split 而不是认为length 会以这种方式工作。您可以使用{a[$6]++} 代替!a[$6]++{} 来保存一个字符
    • @Jotne:您可以再保存两个,因为 OP 似乎并不关心计数。您可以使用:{ a[$6] }
    • @Steve:谢谢!好点,进一步编辑以保存另外 2 个字符。
    • @anubhava 感谢您的回答。你的代码不起作用。我收到这样的错误 awk: 第 1 行:对数组 a 的非法引用
    • 试试这个,看看它是否有效。 awk '{a[$6]} END{for (i in a) s++;print "Total no:of residues in", FILENAME, ":",s}' file
    【解决方案2】:

    试试这个,未经测试:

    awk '
    !seen[FILENAME,$6]++ { numRes[FILENAME]++ }
    END {
        for (fileName in numRes) {
            printf "Total no:of residues in %s : %d\n", fileName, numRes[fileName]
        }
    }
    ' file1.txt file2.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多