파일을 변경하려고 합니다.
값을 찾아 다른 열의 다른 값으로 바꾸는 데 사용합니다 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