값 열의 텍스트를 기반으로 다른 열이 있는 파일에 줄바꿈 도입

값 열의 텍스트를 기반으로 다른 열이 있는 파일에 줄바꿈 도입

첫 번째 열의 값을 기반으로 다른 열이 있는 파일에 줄바꿈을 도입하고 싶습니다.

예를 들어:

입력 파일:

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 파일을 한 줄씩 읽은 다음 해당 줄을 필드로 분할합니다. 무조건 각 줄을 인쇄하지만 표시된 조건을 충족하는 빈 줄을 내보냅니다.

  #!/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. 두 연속 행 사이의 첫 번째 열의 변경 사항을 모니터링할 수 있도록 두 연속 행의 패턴 공간을 유지합니다. 첫 번째 필드에서 변경 사항이 감지된 경우에만 예약된 빈 공간을 인쇄하여 빈 줄을 내보냅니다.

$ 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

파이썬

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

관련 정보