大容量ファイルから「H」で終わらない行を別のファイルに抽出する

大容量ファイルから「H」で終わらない行を別のファイルに抽出する

次のファイルがあります。

TITLE     Protein in water t=   0.00000
REMARK    THIS IS A SIMULATION BOX
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
ATOM      2  H1  SER A 107      21.658  64.259  25.980  1.00  0.00           H

これは非常に大きなファイルです:1.6G2000万行が少し以上です。開始しない行を取得したいです。ATOM そして終了しH、別のファイルに保存します。これを行う最も効率的な方法は何ですか?

ベストアンサー1

コメントの説明によると、

sed -n '/^ATOM.*H$/!p' input > output

「ATOM」で始まり、「H」で終わる行は名前付きファイルから削除(印刷されません)され、残りの行は名前付きファイルinputに印刷されますoutput。 sed 構文は左から右へ:

  • -n- デフォルトでは行を印刷しない
  • /^ATOM.*H$/- ATOMで始まり、その後に任意の数の文字が続き、$H()で終わる行を探します。
  • !p- 印刷ラインいいえ上記のパターンを合わせる

入力ファイルの例:

TITLE     Protein in water t=   0.00000
REMARK    THIS IS A SIMULATION BOX
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
ATOM      2  H1  SER A 107      21.658  64.259  25.980  1.00  0.00           H
TITLE     Protein in water t=   0.00000H
REMARK    THIS IS A SIMULATION BOXH
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
ATOM      2  H1  SER A 107      21.658  64.259  25.980  1.00  0.00           H

結果:

TITLE     Protein in water t=   0.00000
REMARK    THIS IS A SIMULATION BOX
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
TITLE     Protein in water t=   0.00000H
REMARK    THIS IS A SIMULATION BOXH
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N

より直接的な sed 構文は次のとおりです。

sed '/^ATOM.*H$/d' input > output

これは次のように言います。

  • (基本印刷ライン)
  • ATOMで始まりHで終わる行を検索する
  • この行を削除(印刷しない)

おすすめ記事