値列のテキストに基づいて異なる列を持つファイルに改行を導入する

値列のテキストに基づいて異なる列を持つファイルに改行を導入する

最初の列の値に基づいて、他の列があるファイルに改行を導入したいと思います。

たとえば、

入力ファイル:

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800
1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466
1b0y HETATM SF4 A  87
1blu HETATM SF4 A 101
1blu HETATM SF4 A 102


希望の出力:

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102


cshスクリプトを試しましたが、成功しませんでした。

#! /bin/csh
set bin = /home/x/bin

foreach i (`cat pdb_ligands | awk '{print $1}'`)
        echo $i
        sed "s/$i/&\n\n/" pdb_ligands > output.txt
end

答え1

$ awk 'NR > 1 && $1 != prev { print "" } { prev = $1 }; 1' pdb_ligands
1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

これは前の行の最初の列の内容を追跡しますprev

現在の最初の列がファイルの最初の列と異なり、ファイルprevの最初の行にない場合は、改行文字が印刷されます。次に、無条件にすべての行を印刷します。


print ""上記のコードの代替案は、現在のレコードの先頭に$0 = ORS $0改行文字(またはORS出力レコード区切り文字が設定されているすべての項目)を追加するdoです。

後で行を印刷すると、追加の改行が生成されます。

答え2

cshの下でこのpbmにタグを付けたので、それを処理するcshell方式があります。 foreach ループは pdb_ligands ファイルを 1 行ずつ読み込み、その行をフィールドに分割します。無条件に各行を印刷しますが、表示された条件を満たす空白行をエクスポートします。

  #!/bin/csh -f
  set prev = ""
  @ line_num = 1
  foreach line ( "`cat pdb_ligands`" )
    set fields = ( ${line:x} )
    set curr = "${fields[1]}" 
    if ( "$line_num" > 1 && "$prev" != "$curr" ) echo
    printf '%s\n' "$line" 
    set prev = "$curr"
    @ line_num++
  end

方法-GNU sed。 2つの連続する行間の最初の列の変更を監視できるように、2つの連続した行のパターンスペースを維持します。最初のフィールドで変更が検出された場合にのみ、予約済みの空白スペースを印刷して空白行をエクスポートします。

$ sed -Ee '
    $q;N;P
    /^(\S+)\s.*\n\1\s/!{x;p;x;}
    D
' pdb_ligands 

awk を使用して次の行を読み取り、次の行で現在の行の最初のフィールドインデックスを探します。最初に現れるとマッチするという意味です。だからORSをRSに設定しました。それ以外の場合は、空行設定が使用されます。

$ awk '{ while ( getline t > 0 ) {
      ORS = index(t, $1 FS)-1 ? RS RS : RS
      print; $0 = t }
}1' pdb_ligands 

Perlはawkと同じ技術に従います。

$ perl -pae '
    print; $_ = <>;
    /^\Q$F[0]\E\s/ or print $/;
    redo if ! eof;
' pdb_ligands 

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800

1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466

1b0y HETATM SF4 A  87

1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

答え3

    for i in `awk '{if(!seen[$1]++){print $1}}'  filename `; do sed -n '/'$i'/p'  filename ;echo -e "\n"; done



output

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800


1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466


1b0y HETATM SF4 A  87


1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

Python

import re
uniqueele=[]
k=open('filename','r')
for i in k:
    q=i.split(' ')[0]
    if q not in uniqueele:
        uniqueele.append(q)


for g in uniqueele:
    o=re.compile(r'{0}'.format(g))
    t=open('filename','r')
    for h in t:

        if re.search(o,h):
            print h.strip()

    print "\n"

出力

1aa6 HETATM 4MO A 803
1aa6 HETATM SF4 A 800


1ao0 HETATM 5GP A 467
1ao0 HETATM SF4 B 466
1ao0 HETATM SF4 C 466


1b0y HETATM SF4 A  87


1blu HETATM SF4 A 101
1blu HETATM SF4 A 102

関連情報