2013-11-10 54 views
1

我有一些文本文件,如下所示。我需要計算每個文件中殘留的總數。第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 

回答

2

使用此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 
+0

一個很好的方式來獲得元素的數量在一個數組,我會用怎樣'split'和沒有想到'長度'這樣工作。你可以用'{a [$ 6] ++}'來代替'!a [$ 6] ++ {}' – Jotne

+0

@Jotne保存一個字符:謝謝,我編輯保存1個字符:) – anubhava

+0

@Jotne:你可以再省兩個,因爲OP似乎不關心計數。你可以使用:'{a [$ 6]}'。 – Steve

0

試試這個,未經測試:

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