Grep不解析整个文件

时间:2018-06-22 16:39:36

标签: bash shell grep

我想使用grep在包含425409行,文件大小为26.8 MB,UTF8编码的文件中选择不包含“ WAT”的行。

文件看起来像这样

>ATOM      1 N    ALA     1       9.979 -15.619  28.204  1.00  0.00  
>ATOM      2 H1   ALA     1       9.594 -15.053  28.938  1.00  0.00  
>ATOM      3 H2   ALA     1       9.558 -15.358  27.323  1.00  0.00    
>ATOM     12 O    ALA     1       7.428 -16.246  28.335  1.00  0.00  
>ATOM     13 N    HID     2       7.563 -18.429  28.562  1.00  0.00  
>ATOM     14 H    HID     2       6.557 -18.369  28.638  1.00  0.00  
>ATOM     15 CA   HID     2       8.082 -19.800  28.535  1.00  0.00  
>ATOM     24 HE1  HID     2       8.603 -23.670  33.041  1.00  0.00  
>ATOM     25 NE2  HID     2       8.012 -23.749  30.962  1.00  0.00    
>ATOM     29 O    HID     2       5.854 -20.687  28.537  1.00  0.00  
>ATOM     30 N    GLN     3       7.209 -21.407  26.887  1.00  0.00  
>ATOM     31 H    GLN     3       8.168 -21.419  26.566  1.00  0.00  
>ATOM     32 CA   GLN     3       6.271 -22.274  26.157  1.00  0.00  

**16443 lines**  

>ATOM  16425 C116 PA   1089     -34.635   6.968  -0.185  1.00  0.00  
>ATOM  16426 H16R PA   1089     -35.669   7.267  -0.368  1.00  0.00  
>ATOM  16427 H16S PA   1089     -34.579   5.878  -0.218  1.00  0.00  
>ATOM  16428 H16T PA   1089     -34.016   7.366  -0.990  1.00  0.00  
>ATOM  16429 C115 PA   1089     -34.144   7.493   1.177  1.00  0.00  
>ATOM  16430 H15R PA   1089     -33.101   7.198   1.305  1.00  0.00  
>ATOM  16431 H15S PA   1089     -34.179   8.585   1.197  1.00  0.00  
>ATOM  16432 C114 PA   1089     -34.971   6.910   2.342  1.00  0.00  
>ATOM  16433 H14R PA   1089     -35.147   5.847   2.166  1.00  0.00  

**132284 lines**

>ATOM  60981 O    WAT  7952     -46.056  -5.515 -56.245  1.00  0.00  
>ATOM  60982 H1   WAT  7952     -45.185  -5.238 -56.602  1.00  0.00  
>ATOM  60983 H2   WAT  7952     -46.081  -6.445 -56.561  1.00  0.00  
>TER     
>ATOM  60984 O    WAT  7953     -51.005  -3.205 -46.712  1.00  0.00  
>ATOM  60985 H1   WAT  7953     -51.172  -3.159 -47.682  1.00  0.00  
>ATOM  60986 H2   WAT  7953     -51.051  -4.177 -46.579  1.00  0.00  
>TER     
>ATOM  60987 O    WAT  7954     -49.804  -0.759 -49.284  1.00  0.00  
>ATOM  60988 H1   WAT  7954     -48.962  -0.677 -49.785  1.00  0.00  
>ATOM  60989 H2   WAT  7954     -49.868   0.138 -48.903  1.00  0.00

**many lines until the end** 

>TER
>END

我使用了grep -v 'WAT' file.txt,但是它只返回了前16179行不包含“ WAT”的行,并且我看到还有更多行不包含“ WAT”。例如,以下行(以及许多其他行)不会出现在输出中:

> ATOM  16425 C116 PA   1089     -34.635   6.968  -0.185  1.00  0.00

为了弄清楚正在发生的事情,我尝试了grep ' ' file.txt。此命令应返回文件中的每一行,但也只返回前16179行。 我也尝试过使用tail -408977 file.txt | grep ' ',它返回了所有由tail调用的行。然后,我尝试了tail -408978 file.txt | grep ' ',输出完全为空,零行。 我正在研究“正常”的64位系统Kubuntu。 非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

当我尝试时会得到

$: grep WAT file.txt
Binary file file.txt matches

grep假定它是一个二进制文件。添加-a

  

-a,--text等效于--binary-files = text

$: grep -a WAT file.txt|head -3
ATOM  29305 O    WAT  4060     -75.787 -79.125  25.925  1.00  0.00           O
ATOM  29306 H1   WAT  4060     -76.191 -78.230  25.936  1.00  0.00           H
ATOM  29307 H2   WAT  4060     -76.556 -79.670  25.684  1.00  0.00           H
  

您的文件在第16426、16428、16430和16432行的末尾各有2个NULL。

$: tr "\0" @ <file.txt|grep -n @
16426:ATOM  16421 KA   CAL  1085     -20.614 -22.960  18.641  1.00  0.00          @@
16428:ATOM  16422 KA   CAL  1086      20.249  21.546  19.443  1.00  0.00          @@
16430:ATOM  16423 KA   CAL  1087      22.695 -19.700  19.624  1.00  0.00          @@
16432:ATOM  16424 KA   CAL  1088     -22.147  19.317  17.966  1.00  0.00          @@