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
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
문제의 필드를 바꿀 수 있습니다.
기본적으로 파일 쌍에서 작동합니다. 두 개의 읽기 파일 중 첫 번째부터 시작하여 소스 열을 인쇄한 다음 해당 소스 열을 각 쌍의 두 번째로 편집합니다.