awk를 사용하여 다른 열 찾기 및 바꾸기

awk를 사용하여 다른 열 찾기 및 바꾸기

파일을 변경하려고 합니다.

값을 찾아 다른 열의 다른 값으로 바꾸는 데 사용합니다 awk.

입력하다( UiO-66Zr-EH.mof):

unit ntype qqatom
  1  'Zr1'  0.0d0
vibration
0
improper
0
unit ntype qqatom
  2  'H1'  0.0d0
vibration
0
improper
0
unit ntype qqatom
  3  'C25'  0.0d0
vibration
0
improper
0
unit ntype qqatom
  4  'O1'  0.0d0

산출( output):

unit ntype qqatom
  1  'Zr1'  2.222d0
vibration
0
improper
0
unit ntype qqatom
  2  'H1'  3.333d0
vibration
0
improper
0
unit ntype qqatom
  3  'C25'  7.456d0
vibration
0
improper
0
unit ntype qqatom
  4  'O1'  9.99d0

나는 다음 명령을 시도했습니다.

awk < UiO-66Zr-EH.mof '$2 ~ /Zr1/ {$3 ="2.222.d0"}1''$2 ~ /O1/ {$3 ="9.99d0"}1''$2 ~ /C25/ {$3 ="7.45d0"}1''$2 ~ /H1/ {$3 ="3.333d0"}1' > output

그러나 그것은 잘 작동하지 않습니다.

awk동일한 포메이션을 유지하면서 이를 수행하는 데 사용할 수 있는 것이 있습니까 ?

답변1

아마도 두 번째 열에서 정규식 일치보다는 문자열 비교를 수행하고 싶을 것입니다. 제공한 예제를 사용하여 이를 수행하려면 비교에 작은따옴표를 포함해야 하며, 이는 모든 것을 쉘 인용 악몽으로 만듭니다. 그렇게 하면 다음과 같은 결과가 발생합니다.

awk "\$2==\"'Zr1'\" { \$3=\"2.222.d0\" }
     \$2==\"'O1'\" { \$3=\"9.99d0\" }
     \$2==\"'C25'\" { \$3 =\"7.45d0\" }
     \$2==\"'H1'\" { \$3 =\"3.333d0\" }
     { print }" <UiO-66Zr-EH.mof

답변2

여기서 첫 번째 문제는 귀하의 가치가 참조된다는 것입니다. 명령을 사용하여 따옴표를 제거한 sed다음, 꼭 필요한 경우 파일을 처리한 후 다시 넣는 것이 좋습니다 awk. 그것은 마치

sed "s/'//g" UiO-66Zr-EH.mof | awk '{$2=q $2 q}' q="'" 

위의 트릭은 변수를 동일하게 설정 q합니다 . 작은따옴표를 사용하는 간단한 방법 은 다음과 같습니다 .'q $2 q'$2'awk

스크립트에 따르면 다음 대체를 수행하려는 것 같습니다.

$2 is   $3 should be
---------------------
Zr1     2.008.d0
O25     -1.179d0
O1      -0.582d0
C25     -0.121d0
C13     -0.002d0
C1      0.625d0
O29     -0.741d0
H1      0.127d0
H25     0.495d0

그렇다면 나는 다음과 같이 할 것입니다

$ sed "s/'//g" UiO-66Zr-EH.mof |
   awk 'BEGIN{
        c["Zr1"] = "2.008.d0";
        c["O25"] = "-1.179d0";
        c["O1"] = "-0.582d0";
        c["C25"] = "-0.121d0";
        c["C13"] = "-0.002d0";
        c["C1"] = "0.625d0";
        c["O29"] = "-0.741d0";
        c["H1"] = "0.127d0";
        c["H25"] = "0.495d0";
        }
    {if( $2 in c){$3=c[$2]; $2=q$2q}}1;' q="'" 

설명하다

  • 처음에는 sed입력 파일에서 모든 작은따옴표를 제거하십시오.
  • sed의 결과는 입력으로 전달됩니다.awk
  • BEGIN{}블록은 파일을 읽기 전에 실행됩니다.연관 배열매핑이 설정되어 있습니다.
  • 메인 프로그램에서는 $2그것이 배열에 정의되어 있는지 확인하고 c, 그렇다면 $3배열의 해당 값으로 바꿉니다.
  • $2=q$2q작은따옴표를 다시 제자리에 넣으 세요 $2.
  • 마지막으로 1;라인을 인쇄합니다.

예제를 실행할 때의 출력은 다음과 같습니다.

unit ntype qqatom
1 'Zr1' 2.008.d0
vibration
0
improper
0
unit ntype qqatom
2 'H1' 0.127d0
vibration
0
improper
0
unit ntype qqatom
3 'C25' -0.121d0
vibration
0
improper
0
unit ntype qqatom
4 'O1' -0.582d0

관련 정보