유닉스: 한 파일의 전체 열을 다른 파일의 단일 값으로 바꿉니다.

유닉스: 한 파일의 전체 열을 다른 파일의 단일 값으로 바꿉니다.

unix를 사용하여 한 파일의 열을 다른 파일의 단일 값으로 바꾸고 싶습니다.

파일 1은 다음 구조의 pdb 파일입니다.

HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -1.00 H  
HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -1.00 H  

다음과 같이 열 11을 다른 파일(파일 2)에 저장된 단일 값으로 바꾸고 싶습니다.

[1, 27, -81.883, 4.0]
[3, 38, -66.122, 12.0]
[3, 57, -62.134, 12.0]

파일 2(행 1, 열 3)의 값이 파일 1, 열 11의 값이 되도록 하여 파일 1이 다음과 같도록 하려고 합니다.

HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -81.88 H  
HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -81.88 H

다음 명령을 사용하여 파일 1의 열 11을 단일 값(이 경우 2)으로 바꿀 수 있습니다.

awk '{$11=2}1' File1

이런 코드를 찾았어요https://stackoverflow.com/questions/7846476/replace-column-in-one-file-with-column-from-another-using-awk

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1

하지만 file2에서 원하는 값을 file1로 가져오려면 awk와 sed의 조합을 사용해야 한다고 생각합니다.

다음 코드는 열 11의 첫 번째 행을 제공합니다.

awk 'FNR==1{print $11}'

나는 이 두 가지를 결합하는 방법을 모릅니다.

가지고 있는 데이터 세트마다 값이 변경되기 때문에 값으로 검색할 수 없습니다(수백 개의 pdb 파일을 수정해야 함).

누구든지 도와줄 수 있나요?

아래의 두 솔루션 모두 내 pdb 파일 형식을 망쳤습니다. 즉, 다음과 같은 결과를 얻었습니다.

HETATM 1 PA FAD B 600 95.887 47.194 74.387 1.00 -73.248 

바꾸다

HETATM    1  PA  FAD B 600      95.987  47.188  74.293  1.00 -73.248

내가 뭔가 잘못하고 있는 걸까요, 아니면 어떤 아이디어가 있는 걸까요?

답변1

먼저 파일 2에서 원하는 필드를 추출합니다.

value="$(awk -F, 'NR==1{print $3;exit}' file2)"

그런 다음 파일 1의 대체 코드에 삽입합니다.

awk '{$11 = v} 1' v="$value" file1

답변2

원하는 값은 첫 번째 행의 세 번째 열이므로 file2다음을 사용하여 얻을 수 있습니다.

$ awk 'NR==1{print $3}' file2
-81.883,

그러나 여기에는 원하지 않는 쉼표도 포함됩니다. 이를 방지하려면 awk다음을 사용하라고 말할 수 있습니다.누구나공간또는플래그를 필드 구분 기호로 사용하십시오 -F.

$ awk -F", " 'NR==1{print $3}' file2
-81.883

awk를 사용하면 다음 옵션을 사용하여 명령줄에서 변수를 설정할 수 있습니다 -v.

   -v var=val
   --assign var=val
          Assign the value val to the variable var,  before  execution  of
          the  program  begins.  Such variable values are available to the
          BEGIN rule of an AWK program.

따라서 를 실행하면 awk -vfoo="-81.833" {...}awk 스크립트에서 해당 값을 변수로 사용할 수 있습니다 -81.33. foo와 결합하면명령 대체awk, 첫 번째 명령 (원하는 값) 의 출력을 변수(예: 호출됨 i)로 11번째 필드를 변수 값으로 바꾸는 두 번째 스크립트에 전달할 수 있습니다 i.

$ awk -vi="$(awk -F", " 'NR==1{print $3}' file2)" '{$11=i}1;' file1
HETATM 14 H4B FAD B 600 95.544 50.240 71.308 1.00 -81.883 H
HETATM 14 H4B FAD B 600 95.544 50.240 71.308 1.00 -81.883 H

답변3

나는 문제를 잘 이해하지 못했지만 어쨌든 해결책을 찾을 위험이 있다고 생각했습니다.

sed -nse'1!{  :out
              1x
              s/  */&\n/10
              s/^/ /p;t
           }
           x; s/..*//;t out
           g; s/[^ ]* *[^ ]* *//
              s/ .*//;p
           x;    :eat
           $d;n;b eat
'  file1 file2 file3 file4 |
sed '      /^ /!{h;d;}
           s///;N;G
           s/\n[^ ]*\(.*\)\n\(.*\)/\2\1/
'

이것은 효과가 있을 수 있습니다. 별도의 입력 파일 스트림을 sed처리하는 파일이 있는 경우 -s파일 1에서 필수 필드만 선택하고 해당 필드를 전체 파일에 쓰거나 다음 입력 파일에 대한 각 출력을 표시하고 준비하여 두 번째 파일을 OK로 표시해야 합니다. sed문제의 필드를 바꿀 수 있습니다.

기본적으로 파일 쌍에서 작동합니다. 두 개의 읽기 파일 중 첫 번째부터 시작하여 소스 열을 인쇄한 다음 해당 소스 열을 각 쌍의 두 번째로 편집합니다.

관련 정보