첫 번째 열을 기반으로 행을 Grep

첫 번째 열을 기반으로 행을 Grep

아래와 같이 xyz 파일 형식의 파일이 있습니다.

   55
FINAL HEAT OF FORMATION =     0.000000
 C    -1.602726     0.220926     0.289897
 C    -1.486393     1.490851    -0.581098
 C    -0.269002     2.434576    -0.276060
 C     1.010307     1.687714     0.217781
 C     1.485345     0.603160    -0.764139
 C    -1.564938     1.114872    -2.078306
 O    -2.879135     0.437518    -2.475109
 C    -0.550397     3.726131     0.624425
 C    -1.962009     3.939190     1.255790
 C    -2.367687     2.809316     2.219183
 C     0.020100     4.998947    -0.121715
 C    -0.978418     5.719489    -1.074614
 C    -1.616282     4.795344    -2.118148
 C     2.215398     2.612417     0.464811
 C     0.729644     5.994046     0.844547
 C     2.143005     6.393766     0.406166
 C    -2.045078     5.240181     2.079386
 C    -0.323618     6.897509    -1.813043
 C    -1.401212     2.359346    -2.899572
 H    -2.385338     2.081960    -0.396254
 H     0.010153     2.832497    -1.252999
 H     0.084959     3.605123     1.504509
 H     0.809530     4.617245    -0.774572
 H     0.128704     6.897394     0.976132
 H     0.798102     5.548850     1.839117
 H     2.585871     7.101059     1.112504
 H     2.797551     5.521179     0.355908
 H     2.147260     6.862273    -0.578875
 H    -1.790477     6.132728    -0.470526
 H    -1.045932     7.372355    -2.481810
 H     0.046563     7.666682    -1.135188
 H     0.516095     6.553772    -2.424710
 H    -2.319681     5.356939    -2.738366
 H    -0.857441     4.374340    -2.783635
 H    -2.163844     3.970151    -1.668818
 H    -2.716285     4.004456     0.465662
 H    -3.243256     3.107916     2.800711
 H    -2.619420     1.880831     1.722495
 H    -1.559685     2.604091     2.928503
 H    -3.049833     5.345765     2.495339
 H    -1.345140     5.209610     2.919004
 H    -1.835946     6.139276     1.507938
 H     0.771267     1.206903     1.173131
 H     3.062594     2.025264     0.827489
 H     2.528865     3.099255    -0.462839
 H     2.024108     3.390184     1.201447
 H     2.402236     0.135542    -0.396501
 H     0.758861    -0.189092    -0.920031
 H     1.710054     1.046723    -1.738905
 H    -1.261942     0.377911     1.311479
 H    -2.639613    -0.116300     0.341732
 H    -1.021606    -0.605553    -0.121261
 H    -1.454026     2.110341    -3.938854
 H    -2.181199     3.050993    -2.658440
 H    -0.451621     2.804428    -2.687258

.xyz 파일을 분자 입력 형식으로 변환하는 다음 코드가 있습니다.

CARBONS=$(grep -ow "C" $1 | wc -l)
HYDROGENS=$(grep -ow "H" $1 | wc -l)
OXYGENS=$(grep -ow "O" $1 | wc -l)

ATYPES=0
ARRAY=($CARBONS $HYDROGENS $OXYGENS)

for i in "${ARRAY[@]}"
do
        if [ $i -gt 0 ]; then
                ((ATYPES+=1))
        fi
done

echo "BASIS"
echo "co2"
echo ""
echo ""
echo "Atomtypes="$ATYPES" Generators=0 Integrals=1.00D-15 Angstrom"
echo "Charge=6.0 Atoms="$CARBONS""
grep "C" $1
echo "Charge=1.0 Atoms="$HYDROGENS""
grep "H" $1
if [ $OXYGENS -gt 0 ]; then
    echo "Charge=8.0 Atoms="$OXYGENS""
    grep "O" $1
fi

출력은 다음과 같습니다

BASIS
co2


Atomtypes=3 Generators=0 Integrals=1.00D-15 Angstrom
Charge=6.0 Atoms=18
 C    -1.602726     0.220926     0.289897
 C    -1.486393     1.490851    -0.581098
 C    -0.269002     2.434576    -0.276060
 C     1.010307     1.687714     0.217781
 C     1.485345     0.603160    -0.764139
 C    -1.564938     1.114872    -2.078306
 C    -0.550397     3.726131     0.624425
 C    -1.962009     3.939190     1.255790
 C    -2.367687     2.809316     2.219183
 C     0.020100     4.998947    -0.121715
 C    -0.978418     5.719489    -1.074614
 C    -1.616282     4.795344    -2.118148
 C     2.215398     2.612417     0.464811
 C     0.729644     5.994046     0.844547
 C     2.143005     6.393766     0.406166
 C    -2.045078     5.240181     2.079386
 C    -0.323618     6.897509    -1.813043
 C    -1.401212     2.359346    -2.899572
Charge=1.0 Atoms=36
FINAL HEAT OF FORMATION =     0.000000
 H    -2.385338     2.081960    -0.396254
 H     0.010153     2.832497    -1.252999
 H     0.084959     3.605123     1.504509
 H     0.809530     4.617245    -0.774572
 H     0.128704     6.897394     0.976132
 H     0.798102     5.548850     1.839117
 H     2.585871     7.101059     1.112504
 H     2.797551     5.521179     0.355908
 H     2.147260     6.862273    -0.578875
 H    -1.790477     6.132728    -0.470526
 H    -1.045932     7.372355    -2.481810
 H     0.046563     7.666682    -1.135188
 H     0.516095     6.553772    -2.424710
 H    -2.319681     5.356939    -2.738366
 H    -0.857441     4.374340    -2.783635
 H    -2.163844     3.970151    -1.668818
 H    -2.716285     4.004456     0.465662
 H    -3.243256     3.107916     2.800711
 H    -2.619420     1.880831     1.722495
 H    -1.559685     2.604091     2.928503
 H    -3.049833     5.345765     2.495339
 H    -1.345140     5.209610     2.919004
 H    -1.835946     6.139276     1.507938
 H     0.771267     1.206903     1.173131
 H     3.062594     2.025264     0.827489
 H     2.528865     3.099255    -0.462839
 H     2.024108     3.390184     1.201447
 H     2.402236     0.135542    -0.396501
 H     0.758861    -0.189092    -0.920031
 H     1.710054     1.046723    -1.738905
 H    -1.261942     0.377911     1.311479
 H    -2.639613    -0.116300     0.341732
 H    -1.021606    -0.605553    -0.121261
 H    -1.454026     2.110341    -3.938854
 H    -2.181199     3.050993    -2.658440
 H    -0.451621     2.804428    -2.687258
Charge=8.0 Atoms=1
FINAL HEAT OF FORMATION =     0.000000
 O    -2.879135     0.437518    -2.475109

하지만 이런 줄은 없어야 합니다 FINAL HEAT OF FORMATION = 0.000000. 일부 단어는 H문자 및 로 시작하기 때문에 grep 명령이 해당 위치로 이동한다고 생각합니다 O. 올바른 출력은 다음과 같습니다.

BASIS
co2


Atomtypes=3 Generators=0 Integrals=1.00D-15 Angstrom
Charge=6.0 Atoms=18
 C    -1.602726     0.220926     0.289897
 C    -1.486393     1.490851    -0.581098
 C    -0.269002     2.434576    -0.276060
 C     1.010307     1.687714     0.217781
 C     1.485345     0.603160    -0.764139
 C    -1.564938     1.114872    -2.078306
 C    -0.550397     3.726131     0.624425
 C    -1.962009     3.939190     1.255790
 C    -2.367687     2.809316     2.219183
 C     0.020100     4.998947    -0.121715
 C    -0.978418     5.719489    -1.074614
 C    -1.616282     4.795344    -2.118148
 C     2.215398     2.612417     0.464811
 C     0.729644     5.994046     0.844547
 C     2.143005     6.393766     0.406166
 C    -2.045078     5.240181     2.079386
 C    -0.323618     6.897509    -1.813043
 C    -1.401212     2.359346    -2.899572
Charge=1.0 Atoms=36
 H    -2.385338     2.081960    -0.396254
 H     0.010153     2.832497    -1.252999
 H     0.084959     3.605123     1.504509
 H     0.809530     4.617245    -0.774572
 H     0.128704     6.897394     0.976132
 H     0.798102     5.548850     1.839117
 H     2.585871     7.101059     1.112504
 H     2.797551     5.521179     0.355908
 H     2.147260     6.862273    -0.578875
 H    -1.790477     6.132728    -0.470526
 H    -1.045932     7.372355    -2.481810
 H     0.046563     7.666682    -1.135188
 H     0.516095     6.553772    -2.424710
 H    -2.319681     5.356939    -2.738366
 H    -0.857441     4.374340    -2.783635
 H    -2.163844     3.970151    -1.668818
 H    -2.716285     4.004456     0.465662
 H    -3.243256     3.107916     2.800711
 H    -2.619420     1.880831     1.722495
 H    -1.559685     2.604091     2.928503
 H    -3.049833     5.345765     2.495339
 H    -1.345140     5.209610     2.919004
 H    -1.835946     6.139276     1.507938
 H     0.771267     1.206903     1.173131
 H     3.062594     2.025264     0.827489
 H     2.528865     3.099255    -0.462839
 H     2.024108     3.390184     1.201447
 H     2.402236     0.135542    -0.396501
 H     0.758861    -0.189092    -0.920031
 H     1.710054     1.046723    -1.738905
 H    -1.261942     0.377911     1.311479
 H    -2.639613    -0.116300     0.341732
 H    -1.021606    -0.605553    -0.121261
 H    -1.454026     2.110341    -3.938854
 H    -2.181199     3.050993    -2.658440
 H    -0.451621     2.804428    -2.687258
Charge=8.0 Atoms=1
 O    -2.879135     0.437518    -2.475109

나는 grep 명령을 grep -w "^C" $1다음 으로 변경하려고 시도했지만 grep -x "C" $1이들 중 어느 것도 도움이 되지 않았습니다. 이 문제를 어떻게 해결할 수 있나요?

답변1

^CC입력줄의 시작 부분이 아니고 앞에 공백이 있어서 작동하지 않습니다 . grep '^ C' "$1"당신이 원하는 것을해야합니다.

(그런데 를 grep | wc -l사용할 수 있습니다 grep -c. 아, 줄의 따옴표가 echo약간 이상합니다. 변수를 따옴표 안에 넣으면 됩니다.)

답변2

awk로 완전히 시도해 보세요. 예를 들어, 다음 스크립트는 두 개의 배열을 사용하여 atoms지정된 원자에 대한 각 입력 행을 기억하고 count각 원자에 대한 개수를 유지합니다. 전체 입력 파일을 읽고 나면 원하는 형식으로 데이터를 출력합니다.

/^ [[:alpha:]]/ {
  if (count[$1] == 0) {
    atoms[$1]=$0;
  } else {
    atoms[$1]=atoms[$1] "\n" $0;
  }
    count[$1]++
}

END {
  atypes = length(count);

  print "BASIS\nco2\n\n"

  print "Atomtypes=" atypes " Generators=0 Integrals=1.00D-15 Angstrom"

  print "Charge=6.0 Atoms=" count["C"]
  print atoms["C"]

  print "Charge=1.0 Atoms=" count["H"]
  print atoms["H"]

  if (count["O"] > 0) {
    print "Charge=8.0 Atoms=" count["O"]
    print atoms["O"]
  }
}

각 원자와 관련된 전하 조회 테이블이 있으면 크게 개선되어 일반 변환 스크립트로 바뀔 수 있지만 꼭 필요한 것은 아닙니다. 변환 유틸리티가 이미 존재합니다. obabel에서 호출 됩니다 .Open Babel: 오픈 소스 화학 도구 상자xyz프로젝트를 변환하고 다음 과 같은 여러 화학 파일 형식 간에 변환할 수 있습니다 dalmol.

obabel -i xyz input.xyz -o dalmol -O output.dalmol

olabel -L formats | less지원되는 형식의 전체 목록을 얻으려면 실행하세요 .

Debian 또는 Debian 파생 제품(예: Ubuntu, Mint 등)을 실행 중인 경우 설치할 수 있습니다 apt-get install openbabel. 포장 지침은 다음과 같습니다.

Package: openbabel
Version: 3.1.1+dfsg-6
Installed-Size: 630
Maintainer: Debichem Team <[email protected]>
Architecture: amd64
Depends: libc6 (>= 2.14), libgcc-s1 (>= 3.0), libopenbabel7 (>= 3.1.1+dfsg), libstdc++6 (>= 5.2)
Description-en: Chemical toolbox utilities (cli)
 Open Babel is a chemical toolbox designed to speak the many languages of
 chemical data. It allows one to search, convert, analyze, or store data from
 molecular modeling, chemistry, solid-state materials, biochemistry, or related
 areas.  Features include:
 .
  * Hydrogen addition and deletion
  * Support for Molecular Mechanics
  * Support for SMARTS molecular matching syntax
  * Automatic feature perception (rings, bonds, hybridization, aromaticity)
  * Flexible atom typer and perception of multiple bonds from atomic coordinates
  * Gasteiger-Marsili partial charge calculation
 .
 File formats Open Babel supports include PDB, XYZ, CIF, CML, SMILES, MDL
 Molfile, ChemDraw, Gaussian, GAMESS, MOPAC and MPQC.
 .
 This package includes the following utilities:
  * obabel: Convert between various chemical file formats
  * obenergy: Calculate the energy for a molecule
  * obminimize: Optimize the geometry, minimize the energy for a molecule
  * obgrep: Molecular search program using SMARTS pattern
  * obgen: Generate 3D coordinates for a molecule
  * obprop: Print standard molecular properties
  * obfit: Superimpose two molecules based on a pattern
  * obrotamer: Generate conformer/rotamer coordinates
  * obconformer: Generate low-energy conformers
  * obchiral: Print molecular chirality information
  * obrotate: Rotate dihedral angle of molecules in batch mode
  * obprobe: Create electrostatic probe grid

관련 정보